मैं OkHttp का उपयोग कर रहा हूं और मैंने अभी इस मुद्दे का सामना किया है।
पहले भाग के लिए @thucnguyen सही रास्ते पर था ।
यह तब होता है जब आप getActivity () को किसी अन्य थ्रेड में कॉल करते हैं जो टुकड़े को हटा दिए जाने के बाद समाप्त हो जाता है। जब HTTP अनुरोध समाप्त हो जाता है (उदाहरण के लिए onResponse में) तो विशिष्ट मामला getActivity () (एक टोस्ट के लिए) कह रहा है।
गतिविधि बंद होने के बाद भी कुछ HTTP कॉल निष्पादित की जा रही थीं (क्योंकि HTTP अनुरोध पूरा होने में कुछ समय लग सकता है)। मैंने तब, HttpCallback
कुछ फ्रैगमेंट फ़ील्ड को अपडेट करने की कोशिश की और null
जब कोशिश कर रहा था तो अपवाद मिला getActivity()
।
http.newCall(request).enqueue(new Callback(...
onResponse(Call call, Response response) {
...
getActivity().runOnUiThread(...) // <-- getActivity() was null when it had been destroyed already
IMO समाधान कॉलबैक को रोकने के लिए होता है जब टुकड़ा अब और जीवित नहीं होता है (और यह सिर्फ Okhttp के साथ नहीं है)।
तय: रोकथाम।
यदि आपके पास खंड जीवन चक्र (अधिक जानकारी यहाँ ) पर एक नज़र है , तो आप देखेंगे कि वहाँ onAttach(Context context)
और onDetach()
विधियाँ हैं। ये फ्रैगमेंट एक गतिविधि के अंतर्गत आने के बाद कहलाते हैं और क्रमशः होने से पहले बंद हो जाते हैं।
इसका मतलब है कि हम उस कॉलबैक को onDetach
विधि में नियंत्रित करके होने से रोक सकते हैं ।
@Override
public void onAttach(Context context) {
super.onAttach(context);
// Initialize HTTP we're going to use later.
http = new OkHttpClient.Builder().build();
}
@Override
public void onDetach() {
super.onDetach();
// We don't want to receive any more information about the current HTTP calls after this point.
// With Okhttp we can simply cancel the on-going ones (credits to https://github.com/square/okhttp/issues/2205#issuecomment-169363942).
for (Call call : http.dispatcher().queuedCalls()) {
call.cancel();
}
for (Call call : http.dispatcher().runningCalls()) {
call.cancel();
}
}
getActivity()
। इसके अलावा, आप कैसे खंडन कर रहे हैं? क्या आपके पास यह आपके लेआउट में है। xml?