2015-12-19 13 views
7

मैं ओकेएचटीपी 2.7.0 के साथ रेट्रोफिट 2-बीटा 2 का उपयोग कर रहा हूं।रेट्रोफिट 2/ओकेएचटीपी: सभी चल रहे अनुरोधों को रद्द करें

मैं Retrofit .client() विधि का उपयोग कर रहा है और सभी यह अनुरोध चल रहा है रद्द करने के लिए रेट्रोफिट से OkHttpClient वस्तु पाने के लिए, मैं फोन कर रहा हूँ यह cancel(Object tag) विधि है, लेकिन अनुरोध अभी भी चल रहा रखने के लिए और मैं एक प्रतिक्रिया मिल।

यहां तक ​​कि क्लाइंट के Dispatcher के getQueuedCallCount() और getRunningCallCount() रद्द करने के बाद 0 लौटाएं()।

क्या ऐसा कुछ और है जो मुझे काम करने के लिए करने की ज़रूरत है? या यह OkHttp में एक बग हो सकता है?

एक कामकाज के रूप में, मैं ग्राहक के ExecutorService पर shutdownNow() पर कॉल कर रहा हूं लेकिन मैं क्लीनर समाधान पसंद करूंगा।

+0

स्रोत कोड के माध्यम से जाने के बाद अब मैं समझता हूं कि यह क्यों काम नहीं करता है। मैं एक इंटरसेप्टर का उपयोग कर 'अनुरोध' पर टैग सेट कर रहा हूं इसलिए एक नया 'अनुरोध' ऑब्जेक्ट बना रहा हूं। 'OkHttpClient.cancel (ऑब्जेक्ट टैग) 'मूल' अनुरोध 'के बाद से कुछ भी नहीं करता है (जिस पर' रद्द करें ') को' डिस्पैचर 'के अनुरोध कतार में मौजूद होने के बाद से कॉल किया जाता है) अभी भी टैग सेट नहीं है। ऐसा लगता है कि रेट्रोफिट मूल 'अनुरोध' ऑब्जेक्ट पर टैग सेट करने के लिए किसी विधि या इंटरफ़ेस का पर्दाफाश नहीं करता है। –

उत्तर

15

अद्यतन: यह अब बहुत आसान Dispatcher जो एक cancelAll() विधि है का उपयोग करके OkHttp 3 में प्राप्त करने के लिए है। प्रेषक OkHttpClient.dispatcher() से वापस कर दिया गया है।

पुरानी समाधान: एक ही तरीका है यह (मैं मिल सकता है कि) OkHttpClient का एक उपवर्ग बना सकते हैं और उपयोग करें कि रेट्रोफिट साथ करने के लिए है क्या करना है।

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

निम्न पंक्ति टैग TAG_CALL साथ सभी अनुरोधों को रद्द कर देता है। चूंकि उपर्युक्त वर्ग सभी अनुरोधों पर TAG_CALL सेट करता है, इसलिए सभी अनुरोध रद्द कर दिए गए हैं।

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

OkHttpClient को विस्तारित करने के बजाय आप केवल एक अनुरोध इंटरसेप्टर जोड़ सकते हैं और प्रत्येक अनुरोध के लिए अपना टैग जोड़ सकते हैं। – Matthew

+5

@ मैथ्यू हां, 'इंटरसेप्टर' के साथ टैग सेट करने से भी काम किया होगा। हालांकि, OkHttp 3 के साथ, अब यह आवश्यक नहीं है क्योंकि 'डिस्पैचर' 'cancelAll() 'विधि प्रदान करता है जो टैग के बावजूद सभी अनुरोधों को रद्द करता है। –

+2

'डिस्पैचर' वर्ग से अवगत नहीं था, बहुत उपयोगी! – Matthew

संबंधित मुद्दे