Android OkHttp + Retrofit 取消请求的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OkHttp + Retrofit 取消请求的方法相关的知识,希望对你有一定的参考价值。

参考技术A 本文链接

在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求。对于OkHttp来说,具体是调用 Call 的 cancel 方法。

如何找到这一个网络请求并取消掉它呢?

要取消一个请求,OkHttp中可以使用cancel方法, 参考 。

OkHttp的request对象有tag。可以根据tag来标示请求。 参考Stack Overflow 。

Retrofit中并没有显示地提供取消请求的接口。 2018年时Retrofit仍未提供直接访问call对象的方法
那么如何找到目标网络请求呢?

给每个与页面(Activity,Fragment)相关的request加入自定义header, 参考 。
给OkHttpClient添加拦截器。标记出页面的生存状态。如果页面销毁了,则取消对应的request。

以GithubOnandroid项目为例, https://github.com/RustFisher/GithubOnAndroid

持有一个ConcurrentHashMap<String, Boolean>来标记页面存活状态。

给当前Activity起名字。每个Activity的标记名必须唯一。

给OkHttpClient添加拦截器,在拦截器中检查页面的存活情况。
检查后,把这个自定义header移除掉。

call.cancel()后,不会再走Retrofit的subscribe方法。

Retrofit+Okhttp 在 Android 中是不是默认使用 httpCaching?

【中文标题】Retrofit+Okhttp 在 Android 中是不是默认使用 httpCaching?【英文标题】:Is Retrofit+Okhttp using httpCaching as a default in Android?Retrofit+Okhttp 在 Android 中是否默认使用 httpCaching? 【发布时间】:2014-03-01 21:05:19 【问题描述】:

我在我们的一个应用程序中使用了retrofit 和okhttp。

对于 Retrofit 的默认行为,我真的找不到很好的解释。

如果 Okhttp 在类路径上,它将被自动使用。但据我所见,默认的 HttpResponseCache 为空。

我是否需要使用 Retrofit 和 Okhttp 显式启用缓存?

【问题讨论】:

【参考方案1】:

OkHttpClient v2 的正确实现:

int cacheSize = 10 * 1024 * 1024; // 10 MiB
File cacheDir = new File(context.getCacheDir(), "HttpCache");
Cache cache = new Cache(cacheDir, cacheSize);
OkHttpClient client = new OkHttpClient.Builder()
    .cache(cache)
    .build();

见documentation

【讨论】:

setCache在3中不存在,所以可以使用new OkHttpClient.Builder().cache(cache).build(); 谢谢@frostymarvelous【参考方案2】:

OkHttpClient v2.0.0 及更高版本已弃用

正如 Jesse Wilson 指出的,您需要创建自己的缓存。 下面的代码应该创建一个 10MB 的缓存。

File httpCacheDirectory = new File(application.getApplicationContext()
    .getCacheDir().getAbsolutePath(), "HttpCache");

HttpResponseCache httpResponseCache = null;
try 
   httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024);
 catch (IOException e) 
   Log.e(getClass().getSimpleName(), "Could not create http cache", e);


OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setResponseCache(httpResponseCache);
builder.setClient(new OkClient(okHttpClient));

代码基于Jesse Wilsons example on Github。

【讨论】:

如果在帖子上设置了它会被忽略吗?因为我将它设置在用于每个请求的通用构建器上 ***.com/questions/22445177/… 我实际上得到了这个错误......如果我不使用 httpResponseCache.install 它错误新的 HttpResponseCache 不能在外面使用......它不公开.. 那不是10MB缓存吗? @NelsonOsacky @Janusz 实际上不,它是 10KB,而不是 10MB。看看这里:developer.android.com/reference/android/net/http/…long httpCacheSize = 10 * 1024 * 1024; // 10 MiB 同样的规则适用于 OkHttp 的 Cache 构造函数。 仅供参考,这是一个已弃用的答案square.github.io/okhttp/1.x/okhttp/com/squareup/okhttp/…【参考方案3】:

您应该手动创建 OkHttpClient 并按照您的喜好进行配置。在这种情况下,您应该安装缓存。一旦你创建了一个 OkClient 并将它传递给 Retrofit 的 RestAdapter.Builder

此外,没有缓存 HTTP POST 请求。但是,GET 将被缓存。

【讨论】:

我添加了我在单独答案中使用的代码,因为我认为这对其他人来说也会很有趣。由于我从您的示例中复制了它,我希望代码没问题。 ***.com/questions/22445177/… 表示不需要再配置缓存了。这是正确的吗?

以上是关于Android OkHttp + Retrofit 取消请求的方法的主要内容,如果未能解决你的问题,请参考以下文章

Android 网络库的比较:OkHTTP、Retrofit 和 Volley [关闭]

Android开发 retrofit入门讲解

带你走通 OkHttp+Retrofit+Rxjava

带你走通 OkHttp+Retrofit+Rxjava

Android网络框架之Retrofit + RxJava + OkHttp 变化的时代

Android OkHttp + Retrofit 下载文件与进度监听