2015-12-19 19 views
7

Używam Retrofit 2-beta2 z OkTHtt 2.7.0.Retrofit 2/OkHttp: Anuluj wszystkie uruchomione żądania

Aby uzyskać OkHttpClient obiekt z Retrofit Używam metody Retrofit .client() i odwołać wszystko to działa żądań, dzwonię to cancel(Object tag) metoda ale wnioski nadal biec i uzyskać odpowiedź.

Nawet klient Dispatcher klienta getQueuedCallCount() i getRunningCallCount() zwraca 0 po wywołaniu cancel().

Czy jest coś jeszcze, co muszę zrobić, aby zadziałało? Czy może to być błąd w OkHttp?

Jako obejście problemu dzwonię pod numer shutdownNow() na komputerze klienta ExecutorService, ale wolę bardziej przejrzyste rozwiązanie.

+0

Po przejściu przez kod źródłowy rozumiem teraz, dlaczego to nie działa. Ustawiam tag na 'Request' za pomocą przechwytywacza, tworząc nowy obiekt' Request'. 'OkHttpClient.cancel (Object tag)' nie robi nic, ponieważ oryginalny 'Request' (na którym jest wywoływane' cancel() ', ponieważ jest obecny w kolejce żądań' Dispatchera') nadal nie ma zestawu znaczników. Wygląda na to, że Retrofit nie udostępnia żadnej metody ani interfejsu do ustawienia znacznika na oryginalnym obiekcie 'Request'. –

Odpowiedz

15

UPDATE: Jest teraz o wiele łatwiejsze do osiągnięcia w OkHttp 3 przy użyciu Dispatcher który ma metodę cancelAll(). Dyspozytor jest zwracany od OkHttpClient.dispatcher().

Stare Rozwiązanie: Jedynym sposobem, aby to zrobić (co udało mi się znaleźć) jest utworzyć podklasę OkHttpClient i użyć jej z modernizacją.

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

Poniższy wiersz anuluje wszystkie żądania z tagiem TAG_CALL. Ponieważ powyższa klasa ustawia TAG_CALL we wszystkich żądaniach, więc wszystkie żądania zostaną anulowane.

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

Zamiast rozszerzać OkHttpClient można po prostu dodać RequestInterceptor i dodać swój tag dla każdego żądania. – Matthew

+5

@Matthew Tak, ustawienie tagu z 'Interceptor' również by działało. Jednak w przypadku OkHttp 3 nie jest to już wymagane, ponieważ 'Dispatcher' udostępnia metodę' cancelAll() ', która anuluje wszystkie żądania niezależnie od tagów. –

+2

Nie był świadomy klasy "Dispatcher", bardzo pomocny! – Matthew

Powiązane problemy