Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit 2/OkHttp: Cancel all running requests

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

To get the OkHttpClient 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 Dispatcher'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 shutdownNow() on the client's ExecutorService but I'd prefer a cleaner solution.

like image 498
timemanx Avatar asked Dec 19 '15 06:12

timemanx


1 Answers

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();

    @Override
    public Call newCall(Request request) {
        Request.Builder requestBuilder = request.newBuilder();
        requestBuilder.tag(TAG_CALL);
        return super.newCall(requestBuilder.build());
    }
}

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.

retrofit.client().cancel(OkHttpClientExt.TAG_CALL);
like image 62
timemanx Avatar answered Sep 19 '22 13:09

timemanx