我正在开发一个新的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);
}
以下是我面临的问题:
我想根据不同的事件从Activity / Fragment进行多个网络调用,如何以能够发出多个请求的方式设计Activity类。我还想为将在活动中使用的所有常用方法保留一个单独的类(可能是Application类)。我想让我的架构具有凝聚力。
我想在单独的类中解析JSON响应并将结果传递给我的Activity类。我如何在单独的类中解析JSON响应,并将结果从我的NetworkUtil类中的onSuccess()方法传递给我的Activity / Fragment类
我想在整个项目中不使用库或更少的库(至少对于JSON解析部分),此时我将只使用okhttp。
如果有人可以将我引荐到git存储库或示例项目来查看,那将会非常有帮助。
答案 0 :(得分:4)
您当前的代码无法测试并违反SOLID原则,您的活动很快就会变得太大而无法轻松维护。尽量避免在这种情况下使用Utils类。使用IoC。所以我建议你看看MVP / MVVM或任何其他演示模式。
搜索有关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,我已经写了一篇关于这个的博文,你可以迈出第一步: