OkHttp 异步调用:AsyncTask 或 OkHttp 异步 api?
OkHttp async calls: AsyncTask or OkHttp async api?
我对 OkHttp 库不太熟悉,我对它应该如何用于异步请求有一些疑问。
对于 Android 编程,我使用 http 的 android 库并且我使用 asyncTask对于一些请求。
但是因为我想尝试 OkHttp 库,所以我遇到了一些 "problem" 应该如何使用它的正确方法。
示例:
假设您想使用 OkHttp 实现异步请求。我读到 OkHttp 有它自己的异步 api ( https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AsynchronousGet.java )。
但后来我遇到了这个 post (),其中那个人使用了 "old" asyncTask 但带有 OkHttp 请求(我还在其他论坛上发现人们正在使用使用 OkHttp 的异步任务)。
这有点混乱,因为它可以用这段代码简单地制作,也可以适用于 POST:
OkHttpClient client = new OkHttpClient();
// GET request
Request request = new Request.Builder()
.url("http://google.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.e(LOG_TAG, e.toString());
}
@Override
public void onResponse(Response response) throws IOException {
Log.w(LOG_TAG, response.body().string());
Log.i(LOG_TAG, response.toString());
}
});
问题:
- OkHttp 使用异步请求的正确方法是什么?
- 将 AsyncTask 与 OkHTTP 结合使用是一种好习惯吗?
- 在哪些情况下我应该将 AsyncTask 与 OkHttp 一起使用而不是使用 OkHttp async api?
我尝试了这两种方法,它们都可以满足我的需要。这实际上取决于您的情况,以及您真正需要的是什么。 asynctask 版本更好,看起来更简单,但另一个版本(如果你用改造来做的话)提供了更多的功能。
例如在 asyncTask 中,无法取消网络调用,通过改造(我指的是改造,因为我尝试使用此解决方案)可以轻松完成。
这里有一些很好的链接,可以让您更好地了解改造的工作原理:
https://futurestud.io/blog/retrofit-2-upgrade-guide-from-1-9
http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit/
另外AsyncTask其实就是同步调用(这个也要看AsyncTask的版本)。所以对于异步调用,你需要使用其他方法。
我对 OkHttp 库不太熟悉,我对它应该如何用于异步请求有一些疑问。
对于 Android 编程,我使用 http 的 android 库并且我使用 asyncTask对于一些请求。
但是因为我想尝试 OkHttp 库,所以我遇到了一些 "problem" 应该如何使用它的正确方法。
示例:
假设您想使用 OkHttp 实现异步请求。我读到 OkHttp 有它自己的异步 api ( https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AsynchronousGet.java )。
但后来我遇到了这个 post (),其中那个人使用了 "old" asyncTask 但带有 OkHttp 请求(我还在其他论坛上发现人们正在使用使用 OkHttp 的异步任务)。
这有点混乱,因为它可以用这段代码简单地制作,也可以适用于 POST:
OkHttpClient client = new OkHttpClient();
// GET request
Request request = new Request.Builder()
.url("http://google.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.e(LOG_TAG, e.toString());
}
@Override
public void onResponse(Response response) throws IOException {
Log.w(LOG_TAG, response.body().string());
Log.i(LOG_TAG, response.toString());
}
});
问题:
- OkHttp 使用异步请求的正确方法是什么?
- 将 AsyncTask 与 OkHTTP 结合使用是一种好习惯吗?
- 在哪些情况下我应该将 AsyncTask 与 OkHttp 一起使用而不是使用 OkHttp async api?
我尝试了这两种方法,它们都可以满足我的需要。这实际上取决于您的情况,以及您真正需要的是什么。 asynctask 版本更好,看起来更简单,但另一个版本(如果你用改造来做的话)提供了更多的功能。
例如在 asyncTask 中,无法取消网络调用,通过改造(我指的是改造,因为我尝试使用此解决方案)可以轻松完成。
这里有一些很好的链接,可以让您更好地了解改造的工作原理:
https://futurestud.io/blog/retrofit-2-upgrade-guide-from-1-9
http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit/
另外AsyncTask其实就是同步调用(这个也要看AsyncTask的版本)。所以对于异步调用,你需要使用其他方法。