2015-12-19 11 views
7

Sto usando Retrofit 2-beta2 con OkHttp 2.7.0.Retrofit 2/OkHttp: Annulla tutte le richieste in esecuzione

per ottenere l'oggetto OkHttpClient da Retrofit sto usando il metodo Retrofit .client() e di cancellare tutto ciò che è in esecuzione richieste, sto chiamando è cancel(Object tag) metodo, ma le richieste ancora mantenere in esecuzione e ottengo una risposta.

Anche i numeri Dispatcher del client e getRunningCallCount() restituiscono 0 dopo aver chiamato cancel().

C'è altro che devo fare affinché funzioni? O potrebbe essere un bug in OkHttp?

Come soluzione temporanea, sto chiamando shutdownNow() sul client ExecutorService ma preferirei una soluzione più pulita.

+0

Dopo aver esaminato il codice sorgente ora capisco perché questo non funziona. Sto impostando il tag sulla 'Request' usando un intercettore creando quindi un nuovo oggetto' Request'. 'OkHttpClient.cancel (Object tag)' non fa nulla dal momento che l'originale 'Request' (su cui' cancel() 'viene chiamato poiché è presente nella coda di richieste di' Dispatcher') non ha ancora un set di tag. Sembra che Retrofit non esponga alcun metodo o interfaccia per impostare un tag sull'oggetto 'Request' originale. –

risposta

15

UPDATE: Questo è ora molto più facile da realizzare in OkHttp 3 utilizzando Dispatcher che ha un metodo cancelAll(). Il dispatcher viene restituito da OkHttpClient.dispatcher().

vecchia soluzione: L'unico modo per fare questo (che ho potuto trovare) è quello di creare una sottoclasse di OkHttpClient e l'uso che con 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()); 
    } 
} 

La seguente riga cancella tutte le richieste con tag TAG_CALL. Poiché la classe sopra imposta TAG_CALL su tutte le richieste, tutte le richieste vengono annullate.

retrofit.client().cancel(OkHttpClientExt.TAG_CALL); 
+1

Invece di estendere OkHttpClient, è sufficiente aggiungere un RequestInterceptor e aggiungere il tag per ogni richiesta. – Matthew

+5

@Matthew Sì, anche l'impostazione del tag con 'Interceptor' avrebbe funzionato. Tuttavia, con OkHttp 3, questo non è più necessario poiché 'Dispatcher' fornisce il metodo' cancelAll() 'che annulla tutte le richieste indipendentemente dai tag. –

+2

Non ero a conoscenza della classe 'Dispatcher', molto utile! – Matthew