Estou usando o OkHttp e acabei de enfrentar esse problema.
Para a primeira parte, @thucnguyen estava no caminho certo .
Isso aconteceu quando você chama getActivity () em outro segmento que terminou após a remoção do fragmento. O caso típico é chamar getActivity () (por exemplo, para um Toast) quando uma solicitação HTTP terminar (no onResponse, por exemplo).
Algumas chamadas HTTP estavam sendo executadas mesmo após o fechamento da atividade (porque pode demorar um pouco para que uma solicitação HTTP seja concluída). Eu então, através do HttpCallback
tentou atualizar alguns campos de fragmento e tem uma null
exceção ao tentar getActivity()
.
http.newCall(request).enqueue(new Callback(...
onResponse(Call call, Response response) {
...
getActivity().runOnUiThread(...) // <-- getActivity() was null when it had been destroyed already
Na IMO, a solução é impedir que retornos de chamada ocorram quando o fragmento não estiver mais ativo (e isso não ocorre apenas com o Okhttp).
A correção: prevenção.
Se você der uma olhada no ciclo de vida do fragmento (mais informações aqui ), notará que há onAttach(Context context)
eonDetach()
métodos. Eles são chamados após o Fragmento pertencer a uma atividade e pouco antes de deixarem de ser, respectivamente.
Isso significa que podemos impedir que esse retorno de chamada ocorra controlando-o no 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()
. Além disso, como você está instanciando o fragmento? Você o possui em seu layout.xml?