进行网络调用和解析 JSON 响应的架构

Architecture for making Network Calls and parsing the JSON response

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

我的 NetworkUtil Class:

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;
}

这是我的 Activity class:

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 class我能够提出多个请求。我还想为将在活动中使用的所有常用方法保留一个单独的 class(可能是一个应用程序 class)。我想让我的架构具有凝聚力。

  2. 我想在单独的 class 中解析 JSON 响应并将结果传递给我的 Activity class。我如何 在单独的 class 中解析 JSON 响应并将结果从我的 NetworkUtil class

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

如果有人可以向我介绍 git 存储库或示例项目以供查看,那将会很有帮助。

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

  1. 您应该为每个 API 调用创建单独的函数。
  2. 与 JSON 的工作绝对应该从你的 activity 中移出。当你使用 OkHttp 时,我建议你使用 Retrofit 代替它。它的级别更高,使您的 API 调用变得容易,您可以使用 Gson/Jackson/Moshi 或任何其他库作为内置适配器,因此您不会关心 serialising/marshalling Json 字符串进入 Java 个对象,Retrofit 适配器会处理它。

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

我会推荐你​​ Retrofit. You can init it with GsonConverterFactoryto deal with JSON and parse it by using pojoclass here。这是一个示例代码:

 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);

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

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

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

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

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

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

Android MVP without RxJava or Dagger