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

问题:

  1. OkHttp 使用异步请求的正确方法是什么?
  2. 将 AsyncTask 与 OkHTTP 结合使用是一种好习惯吗?
  3. 在哪些情况下我应该将 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的版本)。所以对于异步调用,你需要使用其他方法。