我正在使用带有 OkHttp 2.7.0 的 Retrofit 2-beta2。
要从 Retrofit 获取 OkHttpClient
对象,我使用 Retrofit .client()方法并取消所有正在运行的请求,我称之为 cancel(Object tag)方法,但请求仍在运行,我得到了响应。
甚至客户端的 Dispatcher
的 getQueuedCallCount()和 getRunningCallCount()调用 cancel() 后返回 0。
我还需要做些什么才能让它发挥作用吗?或者它可能是 OkHttp 中的错误?
作为解决方法,我在客户端的 ExecutorService
上调用 shutdownNow()
,但我更喜欢更简洁的解决方案。
最佳答案
更新:现在在 OkHttp 3 中通过使用具有 cancelAll()
方法的 Dispatcher
更容易实现。调度程序从 OkHttpClient.dispatcher()
返回。
旧解决方案:
唯一的方法(我能找到)是创建 OkHttpClient
的子类并将其与 Retrofit 一起使用。
class OkHttpClientExt extends OkHttpClient {
static final Object TAG_CALL = new Object();
@Override
public Call newCall(Request request) {
Request.Builder requestBuilder = request.newBuilder();
requestBuilder.tag(TAG_CALL);
return super.newCall(requestBuilder.build());
}
}
以下行取消所有带有标签 TAG_CALL
的请求。由于上面的类对所有请求都设置了TAG_CALL
,所以所有请求都被取消了。
retrofit.client().cancel(OkHttpClientExt.TAG_CALL);
关于java - 改造 2/OkHttp : Cancel all running requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34367910/