私はOkHttpを使用していますが、この問題に直面しました。
最初の部分では、@ thucnguyenは正しい方向に進んでいました。
これは、フラグメントが削除された後に終了した別のスレッドでgetActivity()を呼び出すと発生しました。典型的なケースは、HTTPリクエストが終了したときに(たとえば、onResponseで)getActivity()を呼び出すことです(Toastの場合など)。
アクティビティが閉じられた後でも、一部のHTTP呼び出しが実行されていました(HTTPリクエストが完了するまでに時間がかかるため)。次に、HttpCallback
いくつかのFragmentフィールドを更新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()
方法。これらは、Fragmentがアクティビティに属した後で、それぞれ停止する直前に呼び出されます。
つまり、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()
です。また、フラグメントをどのようにインスタンス化していますか?あなたのlayout.xmlにそれがありますか?