OkHttp kullanıyorum ve sadece bu sorunla karşılaştım.
İlk bölüm için @ thucnguyen doğru yoldaydı .
Bu, parça kaldırıldıktan sonra bitmiş başka bir iş parçacığında getActivity () öğesini çağırdığınızda oldu. Tipik durum, bir HTTP isteği tamamlandığında (örneğin onResponse'de) getActivity () (örneğin bir Tost için) öğesini çağırmaktır.
Bazı HTTP çağrıları , etkinlik kapatıldıktan sonra bile yürütülüyordu (çünkü bir HTTP isteğinin tamamlanması biraz zaman alabilir). Sonra, HttpCallback
bazı Fragment alanlarını güncellemeye çalıştım ve null
denerken bir istisna aldım getActivity()
.
http.newCall(request).enqueue(new Callback(...
onResponse(Call call, Response response) {
...
getActivity().runOnUiThread(...) // <-- getActivity() was null when it had been destroyed already
IMO çözümü, parça artık hayatta olmadığında geri çağrıların oluşmasını önlemektir (ve bu sadece Okhttp ile değil).
Düzeltme: Önleme.
Eğer parça yaşam döngüsüne bir göz attıysanız (daha fazla bilgi burada ), onAttach(Context context)
ve onDetach()
yöntemler olduğunu fark edeceksiniz . Bunlar, Parça bir etkinliğe ait olduktan sonra ve sırasıyla durmadan hemen önce çağrılır.
Bu, onDetach
yöntemde denetleyerek bu geri aramanın gerçekleşmesini engelleyebileceğimiz anlamına gelir .
@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()
. Ayrıca, parçayı nasıl somutlaştırıyorsunuz? Layout.xml dosyasında var mı?