我正在使用Retrofit 2-beta2和OkHttp 2.7.0。
要从Retrofit获取OkHttpClient
对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我称之为cancel(Object tag)方法,但请求仍在继续运行我收到了回复。
即使客户的Dispatcher
的{{3}}和getQueuedCallCount()在调用cancel()后返回0。
还有什么我需要做的才能工作吗?或者它可能是OkHttp中的错误?
作为解决方法,我在客户端shutdownNow()
上调用ExecutorService
,但我更喜欢更清洁的解决方案。
答案 0 :(得分:20)
更新:现在使用Dispatcher
方法cancelAll()
更容易在OkHttp 3中实现。调度程序从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);