我正在使用Retrofit 2-beta2和OkHttp 2.7.0.
为了OkHttpClient
从Retrofit 获取对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我称之为取消(Object tag)方法,但请求仍然继续运行,我得到了响应.
即使客户Dispatcher
的getQueuedCallCount()和getRunningCallCount()返回0调用cancel()之后.
还有什么我需要做的才能工作吗?或者它可能是OkHttp中的错误?
作为一种解决方法,我打电话shutdownNow()
给客户,ExecutorService
但我更喜欢更清洁的解决方案.
更新:现在通过使用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);