用于进行网络调用和解析JSON响应的体系结构

时间:2018-01-14 16:35:52

标签: android json okhttp android-mvp

我正在开发一个新的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类。我还想为将在活动中使用的所有常用方法保留一个单独的类(可能是Application类)。我想让我的架构具有凝聚力。

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

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

  4. 如果有人可以将我引荐到git存储库或示例项目来查看,那将会非常有帮助。

3 个答案:

答案 0 :(得分:4)

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

  1. 您应该为每个API调用创建单独的函数。
  2. 使用JSON绝对应该从您的活动中移除。当您使用OkHttp时,我建议您使用它进行Retrofit。它是更高级别,使您的API调用更容易,您可以使用Gson / Jackson / Moshi或任何其他库作为内置适配器,因此您不必关心将Json字符串序列化/编组到Java对象中,Retrofit适配器将负责它。
  3. 搜索有关MVP模式的一些文章,并查看this存储库。祝你好运。

答案 1 :(得分:1)

我会推荐你​​Retrofit。您可以使用GsonConverterFactory初始化它来处理JSON并使用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);

答案 2 :(得分:1)

虽然我理解您在使用大量o库方面的顾虑我肯定会推荐Retrofit,但这是行业标准的一个很好的理由(您可以快速谷歌搜索为什么)。

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

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

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

对这些不稳定的对象进行异步处理是配方或错误的代码和内存泄漏。因此,良好的软件模式在这种环境中非常重要。

如果你开始我会推荐MVP,我已经写了一篇关于这个的博文,你可以迈出第一步:

Avenging Android MVP without RxJava or Dagger