2

我对 OkHttp 库不太熟悉,我对如何将它用于异步请求有一些疑问。

对于 Android 编程,我将 android 库用于http,并使用asyncTask进行一些请求。

但是因为我想尝试 OkHttp 库,所以我遇到了一些关于应该使用它的正确方法的“问题”。

例子:

假设您想使用 OkHttp 实现异步请求。我读到 OkHttp 有它自己的异步 api(https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AsynchronousGet.java)。

但后来我遇到了这篇文章( Square 的OkHttp。下载进度),其中那个人使用了“旧”的 asyncTask,但使用了 OkHttp 请求(我还在其他论坛上发现人们正在使用带有 OkHttp 的 AsyncTask)。

这有点令人困惑,因为它可以简单地用这段代码来制作,它也可以适用于 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. 在哪些情况下我应该使用带有 OkHttp 的 AsyncTask 而不是使用 OkHttp 异步 api?
4

1 回答 1

1

我尝试了这两种方法,它们都满足我的需要。这真的取决于你的情况,以及你真正需要什么。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 版本)。所以对于异步调用,你需要使用其他方法。

于 2016-03-05T18:30:57.667 回答