আমি OkHttp ব্যবহার করছি এবং আমি এই সমস্যার মুখোমুখি হয়েছি।
প্রথম অংশের জন্য @ থুকংগুইন সঠিক পথে ছিল ।
আপনি যখন অন্য থ্রেডে getActivity () কে কল করবেন তখন খণ্ডটি সরানোর পরে শেষ হয়েছে এটি ঘটেছে। টিপিক্যাল কেসটি getActivity () (টোস্টের জন্য প্রাক্তন) হিসাবে কল করছে যখন কোনও HTTP অনুরোধ শেষ হয়ে যায় (উদাহরণস্বরূপ onResponse এ)।
ক্রিয়াকলাপটি বন্ধ হয়ে যাওয়ার পরেও কিছু এইচটিটিপি কল কার্যকর করা হয়েছিল (কারণ এইচটিটিপি অনুরোধটি সম্পূর্ণ হতে কিছুক্ষণ সময় নিতে পারে)। আমি তখন 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
আইএমও সমাধানটি হ'ল কলব্যাকগুলি প্রতিরোধ করতে হবে যখন খণ্ডটি আর জীবিত থাকবে না (এবং এটি কেবল ওখটপ-এর সাথে নয়)।
সংশোধন: প্রতিরোধ।
আপনার যদি খণ্ডের জীবনচক্রটি ( এখানে আরও তথ্য ) দেখুন তবে আপনি দেখতে পাবেন যে সেখানে রয়েছে 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()
। এছাড়াও, আপনি কীভাবে খণ্ডটি ইনস্ট্যান্ট করছেন? আপনার লেআউট.এক্সএমএলে এটি রয়েছে?