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

timemanx:

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

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

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

为了使它正常工作,我还需要做什么吗?还是可能是OkHttp中的错误?

作为一种解决方法,我正在致电shutdownNow()客户,ExecutorService但我希望使用更清洁的解决方案。

timemanx:

更新:现在,使用Dispatcher具有cancelAll()方法的OkHttp 3可以轻松实现这一点调度程序是从返回的OkHttpClient.dispatcher()

旧解决方案:这样做的唯一方法(我可以找到)是创建OkHttpClientRetrofit 的子类并与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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章