2015-12-19 24 views
7

Okhttp 2.7.0 ile birlikte Retrofit 2-beta2 kullanıyorum. Retrofit 2/OkHttp: Tüm çalışan isteklerini iptal et

Ben Retrofit .client() yöntemi kullanıyorum ve istekleri çalışıyor hepsi iptal etmek Retrofit dan OkHttpClient nesneyi almak için aradım o cancel(Object tag) yöntem ama istekleri hala yayınlanmaya devam ve bir yanıt almak. Hatta müşterinin Dispatcher 'un getQueuedCallCount() ve getRunningCallCount() numaralı sayfaları bile, cancel()' i çağırdıktan sonra 0 değerini döndürür..

Bunun çalışması için yapmam gereken başka bir şey var mı? Ya da OkHttp'de bir hata olabilir mi?

Bir geçici çözüm olarak, istemcinin ExecutorService numaralı telefonunda shutdownNow() numaralı telefonu arıyorum, ancak daha temiz bir çözüm tercih ediyorum.

+0

Kaynak koddan geçtikten sonra, bunun neden çalışmadığını anlıyorum. Bir önleme kullanarak 'Request' etiketini ayarlıyorum, bu yüzden yeni bir 'Request 'nesnesi yaratıyorum. 'OkHttpClient.cancel (Object tag)' orijinal 'Request''den (' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '' komut satırında mevcut olduğundan beri ''() '' denir. Görünüşe göre, Retrofit, orijinal 'Request 'nesnesinde bir etiket oluşturmak için herhangi bir yöntem veya arabirim göstermez. –

cevap

15

GÜNCELLEME: Bu artık bir cancelAll() yöntemi vardır Dispatcher kullanarak OkHttp 3'te elde etmek çok daha kolaydır. Dağıtım memuru OkHttpClient.dispatcher()'dan döndürülür.

Eski Çözüm: tek yolu bu (bulabildiğim o) OkHttpClient bir alt sınıfını oluşturmak ve iyileştirme ile bu kullanmaktır yapmak.

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

aşağıdaki satırı etiketi TAG_CALL ile tüm istekleri iptal eder. Yukarıdaki sınıf, tüm isteklerde TAG_CALL'u ayarladığı için tüm istekler iptal edilir.

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

OkHttpClient'i genişletmek yerine, bir RequestInterceptor ekleyebilir ve her istek için etiketinizi ekleyebilirsiniz. – Matthew

+5

@Matthew Evet, etiketi bir "Interceptor" ile ayarlamak da işe yarayacaktı. Ancak, OkHttp 3 ile, artık “Dispatcher”, etiketlerden bağımsız olarak tüm istekleri iptal eden “cancelAll()” yöntemini sağladığından artık gerekli değildir. –

+2

'Dispatcher 'sınıfının farkında değildi, çok yardımcı oldu! – Matthew

İlgili konular