OkHttp를 사용하고 있으며이 문제에 직면했습니다.
첫 번째 부분에서 @thucnguyen은 올바른 길을 가고 있었다 .
조각이 제거 된 후 완료된 다른 스레드에서 getActivity ()를 호출 할 때 발생했습니다. 일반적인 경우는 HTTP 요청이 완료되면 (예 : onResponse에서) getActivity () (예 : 토스트)를 호출하는 것입니다.
활동이 종료 된 후에도 일부 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에 있습니까?