2015-08-18 10 views
7

मेरे पास एक एंड्रॉइड एसडीके है जो ओकेएचटीपी का उपयोग करता है। मेरे नमूना ऐप में जो मेरे एसडीके का उपयोग करता है सबकुछ ठीक काम करता है। हालांकि, मेरे उपयोगकर्ताओं में से एक, जब StrictMode चालू है, तो निम्नलिखित java.lang.Throwable: Explicit termination method 'close' not called प्राप्त हो रहा है। मैंने अपने स्वयं के ऐप में स्ट्रिक्टोड के साथ इसे दोहराने की कोशिश की है और यह त्रुटि नहीं मिली है।प्रतिक्रिया कब कॉल करें।()। बंद करें()

मुझे समझ में आता है कि मुझे response.body().close() पर कॉल करना चाहिए, लेकिन मैं अभी भी थोड़ा उलझन में हूं कि यह मेरे ऐप में क्यों नहीं हो रहा है। जिस स्टैक ट्रेस ने मुझे भेजा है, उसमें केवल मेरी कक्षाएं हैं, इसलिए ऐसा लगता है कि उसके कोड में कुछ भी ऐसा नहीं कर रहा है।

यह भी ध्यान में है कि मेरे एसडीके के अनुरोध में से केवल एक प्रतिक्रिया प्रतिक्रिया है। लेकिन यह मेरा अनुरोध नहीं है कि मेरा उपयोगकर्ता अपवाद पैदा कर रहा है।

क्या कोई और चीज है जो इसका कारण बन सकती है?

मुझे .close() पर कॉल कब करना चाहिए? execute() पर कॉल करने के तुरंत बाद इसे कॉल करना उचित होगा? क्या शरीर को बंद करना भविष्य में इसे पढ़ने से रोक देगा?

उत्तर

8

आपको हमेशा close() पर कॉल करना चाहिए। OkHttp's source से:

कॉलर प्रतिक्रिया के Response.body() विधि के साथ प्रतिक्रिया शरीर को पढ़ सकता है। कनेक्शन रीसाइक्लिंग की सुविधा के लिए, कॉलर्स को हमेशा प्रतिक्रिया निकाय बंद करना चाहिए।

आपको शायद close() पर कॉल करना चाहिए जैसे ही आपको प्रतिक्रिया से आपको क्या चाहिए। इसे एक चर में स्टोर करें, फिर ResponseBody बंद करें।

+2

लगभग हमेशा - 'स्ट्रिंग() 'और' बाइट्स()' अपने आप को बंद करें –

+1

@ItaiHanski, क्या आप निश्चित हैं? मुझे कोड में इसका कोई सबूत नहीं मिला। –

+2

@AleksandarStojadinovic हाँ। ['ResponseBody'] पर प्रलेखन देखें (https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/ResponseBody.java#L51)। 'स्ट्रिंग()' और 'बाइट्स()' –

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