Shubhadeep Chaudhuri Shubhadeep Chaudhuri - 1 year ago 728
Android Question

Retrofit 2/OkHttp: Cancel all running requests

I'm using Retrofit 2-beta2 with OkHttp 2.7.0.

To get the

object from Retrofit I'm using the Retrofit .client() method and to cancel all it's running requests, I'm calling it's cancel(Object tag) method but the requests still keep running and I get a response.

Even the client's
's getQueuedCallCount() and getRunningCallCount() return 0 after calling cancel().

Is there anything else that I need to do for this to work? Or could it be a bug in OkHttp?

As a workaround, I'm calling
on the client's
but I'd prefer a cleaner solution.

Answer Source

UPDATE: This is now much easier to achieve in OkHttp 3 by using Dispatcher which has a cancelAll() method. The dispatcher is returned from OkHttpClient.dispatcher().

Old Solution: The only way to do this (that I could find) is to create a subclass of OkHttpClient and use that with Retrofit.

class OkHttpClientExt extends OkHttpClient {
    static final Object TAG_CALL = new Object();

    public Call newCall(Request request) {
        Request.Builder requestBuilder = request.newBuilder();
        return super.newCall(;

The following line cancels all requests with tag TAG_CALL. Since the class above sets TAG_CALL on all requests, so all requests are cancelled.