【问题标题】:Architecture for making Network Calls and parsing the JSON response进行网络调用和解析 JSON 响应的架构
【发布时间】:2018-01-14 16:35:51
【问题描述】:

我正在开发一个新的 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;
}

这是我的 Activity 类:

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 存储库或示例项目以进行查看,那将是非常有帮助的。

【问题讨论】:

    标签: android json okhttp android-mvp


    【解决方案1】:

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

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

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

    【讨论】:

    • 我检查了你提到的存储库和一些关于 MVP/MVVM 的存储库,但它们都使用改造、GSON 或一些库进行 JSON 解析。我想尽可能减少我的图书馆数量。我在networkUtil类下的onResponse中得到的响应不能通过线程或者handler传递给onResponse下的Activity类吗?
    • @localhost 你也可以在你的库中使用 MVP。这都是关于将任务委派给类并将它们链接起来。您的 OkHttp 的方法入队是异步的。那么你的听众有什么意义呢?
    • 监听器接口帮助我重用代码,在我的例子中是 networkUtil 类 - 带有我想要调用的多个 API 的 URI
    • @localhost 好吧,我给了你建议/改进,现在由你决定。但是静态工具类是纯粹的邪恶:)
    【解决方案2】:

    我会推荐你​​Retrofit。你可以用GsonConverterFactory初始化它来处理JSON并使用pojoclasshere解析它。这是一个示例代码:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      Android MVP without RxJava or Dagger

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多