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

时间:2015-12-19 06:13:51

标签: java android retrofit okhttp

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

要从Retrofit获取OkHttpClient对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我称之为cancel(Object tag)方法,但请求仍在继续运行我收到了回复。

即使客户的Dispatcher的{​​{3}}和getQueuedCallCount()在调用cancel()后返回0。

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

作为解决方法,我在客户端shutdownNow()上调用ExecutorService,但我更喜欢更清洁的解决方案。

1 个答案:

答案 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);