Eu raramente recebo esse erro ao fazer uma chamada de API.
java.lang.IllegalStateException: Fragment not attached to Activity
Eu tentei colocar o código dentro do isAdded()
método para verificar se o fragmento está atualmente adicionado à sua atividade, mas ainda assim raramente recebo esse erro. Não consigo entender por que ainda estou recebendo esse erro. Como posso evitar isso?
Está mostrando erro na linha
cameraInfo.setId(getResources().getString(R.string.camera_id));
Abaixo está o exemplo de chamada da API que estou fazendo.
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
android
android-fragments
android-activity
android-volley
android-lifecycle
Desenvolvedor Android
fonte
fonte
Respostas:
Este erro ocorre devido ao efeito combinado de dois fatores:
onResponse()
ouonError()
(que funciona no encadeamento principal) sem saber se oActivity
ainda está em primeiro plano ou não. Se eleActivity
se foi (o usuário navegou em outro lugar),getActivity()
retorna nulo.Response
é expresso como uma classe interna anônima, que possui implicitamente uma forte referência àActivity
classe externa . Isso resulta em um vazamento de memória clássico.Para resolver esse problema, você deve sempre fazer:
e também, use
isAdded()
noonError()
método também:fonte
AsyncTask
es dentro de umActivity
, não há maneira infalível de evitar NPEs '. Sempre existe a chance de o usuário navegar para longe da correnteActivity
enquanto um dos threads faz algo em segundo plano e, quando o thread é concluído eonPostExecute()
ouonResponse()
é chamado, não háActivity
. Tudo o que você pode fazer é fazer verificações de referências nulas em vários pontos no seu código, e que não é à prova de balas :)added
sinalizador booleano e se aActivity
instância atual énull
ou não.O ciclo de vida do fragmento é muito complexo e cheio de erros, tente adicionar:
fonte
return mHost != null && mAdded;
- Isso é o que dentro do método fragment.isAdded (). Eu pensei que mHost é uma atividade se você rastrear, mas parece que mHost está dentro de FragmentActivity. Então, provavelmente, você está certo. Alguma adição?Encontrei Solução muito simples O método isAdded () , que é um dos métodos de fragmento para identificar se esse fragmento atual está anexado à sua atividade ou não.
podemos usar isso como em qualquer lugar na classe de fragmentos, como:
fonte
Exceção: java.lang.IllegalStateException: Fragment
DeadlineListFragment {ad2ef970} não anexado à Atividade
Categoria: Ciclo de vida
Descrição : ao executar uma operação demorada no encadeamento em segundo plano (por exemplo, AsyncTask), um novo fragmento foi criado nesse meio tempo e foi desanexado para a Atividade antes da conclusão do encadeamento em segundo plano. O código no thread da interface do usuário (por exemplo, onPostExecute) chama um fragmento desanexado, lançando essa exceção.
Solução de correção:
Cancele o encadeamento em segundo plano ao pausar ou parar o fragmento
Use isAdded () para verificar se o fragmento está anexado e, em seguida, para getResources () da atividade.
fonte
posso estar atrasado, mas posso ajudar alguém ... A melhor solução para isso é criar uma instância de classe de aplicativo global e chamá-la no fragmento específico em que sua atividade não está sendo anexada
como abaixo
Aqui está a classe da aplicação
fonte
Este erro pode ocorrer se você estiver instanciando um fragmento que de alguma forma não possa ser instanciado:
No meu caso, eu encontrei isso quando tentei usar:
fonte
No uso de fragmentos
isAdded()
ele retornará verdadeiro se o fragmento estiver atualmente anexado à Atividade.Se você deseja verificar dentro da Atividade
Espero que ajude alguém
fonte
Adotei a seguinte abordagem para lidar com esse problema. Criou uma nova classe que atua como invólucro para métodos de atividade como este
Agora, onde quer que eu precise acessar recursos de fragmentos ou atividades, em vez de chamar diretamente o método, eu uso essa classe. Caso a atividade
context
não seja,null
ela retorna o valor do ativo e, casocontext
seja nulo, passa um valor padrão (que também é especificado pelo responsável pela chamada da função).Importante Esta não é uma solução, é uma maneira eficaz de lidar com essa falha normalmente. Você deseja adicionar alguns logs nos casos em que você está obtendo uma instância de atividade como nula e tentar corrigir isso, se possível.
fonte
isso acontece quando o fragmento não possui um contexto, portanto, o método getActivity () retorna nulo. verifique se você usa o contexto antes de obtê-lo , ou se a Atividade não existe mais. use context in fragment.onCreate e após a resposta da API geralmente, esse problema ocorre
fonte
Às vezes, essa exceção é causada por um erro na implementação da biblioteca de suporte. Recentemente, tive que fazer o downgrade de 26.1.0 para 25.4.0 para me livrar dele.
fonte
Esse problema ocorre sempre que você chama um contexto indisponível ou nulo quando o chama. Pode ser uma situação quando você está chamando o contexto do segmento de atividade principal em um segmento de segundo plano ou o contexto do segmento de segundo plano no segmento de atividade principal.
Por exemplo, atualizei minha sequência de preferências compartilhadas como a seguir.
E chamou finish () logo depois. Agora, o que ele faz é que, como commit, execute no thread principal e interrompa qualquer outro commit do Async, se chegar até ele terminar. Portanto, seu contexto permanece ativo até a gravação ser concluída. Portanto, o contexto anterior está ativo, causando o erro.
Portanto, verifique seu código novamente se houver algum código com esse problema de contexto.
fonte