当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Retrofit2/OkHttp:取消所有正在运行的请求》经验,为你挑选了1个好方法。

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

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

即使客户Dispatcher的getQueuedCallCount()和getRunningCallCount()返回0调用cancel()之后.

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

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



1> Shubhadeep C..:

更新:现在通过使用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);


@Matthew是的,用"拦截器"设置标签也可以.但是,使用OkHttp 3,不再需要这个,因为`Dispatcher`提供了`cancelAll()`方法,该方法取消所有请求而不管标记.
不知道`Dispatcher`课,非常有帮助!
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有