Estoy usando OkHttp y acabo de enfrentar este problema.
Para la primera parte, @thucnguyen estaba en el camino correcto .
Esto sucedió cuando llamas a getActivity () en otro hilo que terminó después de que el fragmento ha sido eliminado. El caso típico es llamar a getActivity () (por ejemplo, para un Toast) cuando finaliza una solicitud HTTP (en onResponse, por ejemplo).
Algunas llamadas HTTP se estaban ejecutando incluso después de que se cerró la actividad (porque puede llevar un tiempo completar una solicitud HTTP). Luego, a través del HttpCallback
intento de actualizar algunos campos Fragmento y obtuve una null
excepción al intentarlo getActivity()
.
http.newCall(request).enqueue(new Callback(...
onResponse(Call call, Response response) {
...
getActivity().runOnUiThread(...) // <-- getActivity() was null when it had been destroyed already
En mi opinión, la solución es evitar que se produzcan devoluciones de llamada cuando el fragmento ya no está vivo (y eso no es solo con Okhttp).
La solución: prevención.
Si usted tiene una mirada en el ciclo de vida del fragmento (más información aquí ), usted notará que hay onAttach(Context context)
y onDetach()
métodos. Estos se llaman después de que el Fragmento pertenece a una actividad y justo antes de dejar de serlo, respectivamente.
Eso significa que podemos evitar que esa devolución de llamada suceda al controlarla en el onDetach
método.
@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()
. Además, ¿cómo estás instanciando el fragmento? ¿Lo tienes en tu layout.xml?