3

我正在开发一个新的 Android 应用程序,我想正确地组织所有组件 - 网络调用类、JSON 解析类等。我正在使用 Okhttp 进行网络调用;经过大量研究,我能够像这样构造我的代码:

我的 NetworkUtil 类:

public class NetworkUtil {

public static void getData(String url, final OkHttpListener listener){
    OkHttpClient client = new OkHttpClient();
    // GET request
    Request request = new Request.Builder()
            .url(url)
            .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {
            listener.onFailure(request, e);
        }
        @Override
        public void onResponse(Response response) throws IOException {
            listener.onResponse(response);
        }
    });
}

我的网络回调接口:

public interface OkHttpListener {
void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;
}

这是我的活动课:

OkHttpListener listener = new OkHttpListener() {
        @Override
        public void onFailure(Request request, IOException e) {
            Log.e(LOG_TAG, e.toString());
        }

        @Override
        public void onResponse(Response response) throws IOException {
            String responseBody = response.body().string();
            Log.i(LOG_TAG, responseBody);
        }
    };
    String url = "http://myserver/api/getvalues";
    OkHttpUtils.getData(url, listener);
    String url1 = "http://myserver/api/getvalues/123";
    OkHttpUtils.getData(url1, listener);
}

以下是我面临的问题:

  1. 我想根据不同的事件从 Activity/Fragment 进行多个网络调用,如何设计 Activity 类以使我能够发出多个请求。我还想为将在活动中使用的所有常用方法保留一个单独的类(可能是一个应用程序类)。我想让我的架构具有凝聚力。

  2. 我想在一个单独的类中解析 JSON 响应并将结果传递给我的 Activity 类。如何在单独的类中解析 JSON 响应并将结果从 NetworkUtil 类中的 onSuccess() 方法传递给我的 Activity/Fragment 类

  3. 我想在整个项目中不使用库或使用非常少的库(至少对于 JSON 解析部分),此时我将只使用 okhttp。

如果有人可以将我推荐给 git 存储库或示例项目以进行查看,那将非常有帮助。

4

3 回答 3

5

您当前的代码无法测试并且违反了 SOLID 原则,您的活动很快就会变得太大而难以维护。在这种情况下尽量避免使用 Utils 类。使用国际奥委会。所以我建议你看看 MVP/MVVM 或任何其他演示模式。

  1. 您应该为每个 API 调用创建单独的函数。
  2. 使用 JSON 绝对应该从您的活动中移出。当你使用 OkHttp 时,我建议你使用 Retrofit。它的更高级别使您的 API 调用变得容易,您可以使用 Gson/Jackson/Moshi 或任何其他库作为内置适配器,因此您不必关心将 Json 字符串序列化/编组为 Java 对象,Retrofit 适配器将负责它。

搜索一些关于 MVP 模式的文章并查看这个存储库。祝你好运。

于 2018-01-14T16:52:26.123 回答
1

尽管我理解您对使用大量 o 库的担忧,但我肯定会推荐Retrofit它,但它是行业标准是有充分理由的(您可以快速谷歌搜索原因)。

对于解析,您应该使用,Moshi因为您已经在使用Okhttp.

另一个建议是将您的代码移动到更合适和可扩展的模式,例如 MVP 或 MVVM。您必须考虑的一件事:

片段和/或活动不是你的,它们是 Android 拥有的对象,这意味着它们可以随时被销毁。

对这些不稳定的对象进行异步工作是秘诀或错误的代码和内存泄漏。因此,一个好的软件模式在这个环境中是非常重要的。

如果您刚开始,我会推荐 MVP,我已经写了一篇关于此的博客文章,您可以在其中迈出第一步:

复仇 没有 RxJava 或 Dagger 的 Android MVP

于 2018-01-15T19:16:48.357 回答
1

我会推荐你​​改造。您可以在此处GsonConverterFactory使用 pojoclass 对其进行初始化以处理 JSON 并对其进行解析。这是一个示例代码:

 String BASE_URL = "https://YOUR API";
            Retrofit.Builder builder = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create());
            apiService = builder.build().create(ApiService.class);
于 2018-01-14T16:57:39.453 回答