Retrofit 2/OkHttp:取消所有正在运行的请求

Shu*_*uri 11 java android retrofit okhttp

我正在使用Retrofit 2-beta2和OkHttp 2.7.0.

为了OkHttpClient从Retrofit 获取对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我称之为取消(Object tag)方法,但请求仍然继续运行,我得到了响应.

即使客户DispatchergetQueuedCallCount()getRunningCallCount()返回0调用cancel()之后.

还有什么我需要做的才能工作吗?或者它可能是OkHttp中的错误?

作为一种解决方法,我打电话shutdownNow()给客户,ExecutorService 但我更喜欢更清洁的解决方案.

Shu*_*uri 22

更新:现在通过使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

以下行取消所有带标记的请求TAG_CALL.由于上面的类设置TAG_CALL了所有请求,因此所有请求都被取消.

retrofit.client().cancel(OkHttpClientExt.TAG_CALL);
Run Code Online (Sandbox Code Playgroud)

  • @Matthew是的,用"拦截器"设置标签也可以.但是,使用OkHttp 3,不再需要这个,因为`Dispatcher`提供了`cancelAll()`方法,该方法取消所有请求而不管标记. (5认同)
  • 不知道`Dispatcher`课,非常有帮助! (2认同)