OkHttpClient无法取消Call by tag

Rya*_*n R 5 java okhttp okhttp3

我最近升级到OkHttp3,并注意到您无法再直接从客户端取消标签.这必须由应用程序现在处理.

这里以CHANGELOG为例:

取消批量呼叫现在是应用程序的责任. 取消按标记调用的API已被删除,并替换为更通用的机制.调度程序现在通过其runningCalls()和queuedCalls()方法公开所有正在进行的调用.您可以编写通过标记,主机或其他方式选择调用的代码,并对不再需要的调用Call.cancel().

我用我的简单实用工具方法自行回答这篇文章,以取消正在运行或排队的Call by tag.

Rya*_*n R 10

使用以下实用程序类取消正在运行或排队Call的标记:

public class OkHttpUtils {
    public static void cancelCallWithTag(OkHttpClient client, String tag) {
        // A call may transition from queue -> running. Remove queued Calls first.
        for(Call call : client.dispatcher().queuedCalls()) {
            if(call.request().tag().equals(tag))
                call.cancel();
        }            
        for(Call call : client.dispatcher().runningCalls()) {
            if(call.request().tag().equals(tag))
                call.cancel();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个示例,其中包含一个测试用例:https://gist.github.com/RyanRamchandar/64c5863838940ec67f03

  • 来自其中一个OkHttp开发者:https://twitter.com/jessewilson/status/709260263271309312 (2认同)