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

2022-09-02 20:54:41

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

为了从改造中获取对象,我使用改造.client()方法并取消所有正在运行的请求,我调用它的unde(Object tag)方法,但请求仍然保持运行,我得到一个响应。OkHttpClient

甚至客户端的 getQueuedCallCount()getRunningCallCount() 在调用 cancel() 后也返回 0。Dispatcher

我需要做些什么才能使它起作用吗?或者它可能是OkHttp中的一个错误?

作为一种解决方法,我正在调用客户端的,但我更喜欢更干净的解决方案。shutdownNow()ExecutorService


答案 1

更新:现在,通过使用具有方法,在OkHttp 3中更容易实现这一点。调度程序从 返回。DispatchercancelAll()OkHttpClient.dispatcher()

旧解决方案:做到这一点的唯一方法(我能找到的)是创建一个子类,并将其与改造一起使用。OkHttpClient

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_CALLTAG_CALL

retrofit.client().cancel(OkHttpClientExt.TAG_CALL);

答案 2

推荐