java - 改造 2/OkHttp : Cancel all running requests

标签 java android retrofit okhttp

我正在使用带有 OkHttp 2.7.0 的 Retrofit 2-beta2。

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

甚至客户端的 DispatchergetQueuedCallCount()getRunningCallCount()调用 cancel() 后返回 0。

我还需要做些什么才能让它发挥作用吗?或者它可能是 OkHttp 中的错误?

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

最佳答案

更新:现在在 OkHttp 3 中通过使用具有 cancelAll() 方法的 Dispatcher 更容易实现。调度程序从 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);

关于java - 改造 2/OkHttp : Cancel all running requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34367910/

相关文章:

java - 改造 get List 无法处理成字符串

java - 创建文件 [...] : Instantiation of bean failed (NullPointerException) 中定义的名称为 'db' 的 bean 时出错

java - 如何在Java中添加循环定时器?

java - 高效地使用 ConcurrentHashMap?

android - 如何在 TabActivity 中隐藏选项卡?

android - 如果值为空,如何将(空格)作为值传递给 api

java - 单个正则表达式具有 CSV 和 xlsx 文件格式

Java - 使用 ConcurrentLinkedDeque 避免 NonSuchElementException

android - 如何知道我的手机上是否有加速度计?

android - 改造错误 : No Retrofit annotation found.(参数 #1)