我正在使用带有OkHttp 2.7.0的Retrofit 2-beta2。
为了OkHttpClient
从Retrofit 获取对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我将其称为cancel(Object tag)方法,但是请求仍然保持运行,并且得到响应。
即使客户Dispatcher
的getQueuedCallCount()和getRunningCallCount()返回0调用cancel()之后。
为了使它正常工作,我还需要做什么吗?还是可能是OkHttp中的错误?
作为一种解决方法,我正在致电shutdownNow()
客户,ExecutorService
但我希望使用更清洁的解决方案。
更新:现在,使用Dispatcher
具有cancelAll()
方法的OkHttp 3可以轻松实现这一点。调度程序是从返回的OkHttpClient.dispatcher()
。
旧解决方案:这样做的唯一方法(我可以找到)是创建OkHttpClient
Retrofit 的子类并与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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句