Estou tendo algumas das seguintes exceções:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Eu pesquisei no Google e vi que tem algo a ver com pop-ups e virar a tela, mas não há referência ao meu código.
As perguntas são:
- existe uma maneira de saber exatamente quando esse problema está acontecendo?
- além de virar a tela, há outro evento ou ação que desencadeia esse erro?
- como faço para evitar que isso aconteça?
View#onAttachedToWindow()
ter sido chamado?Respostas:
Tive esse problema em que, em uma mudança de orientação da tela, a atividade terminava antes de AsyncTask com a caixa de diálogo de progresso concluída.
onPause()
Parece que resolvi isso definindo a caixa de diálogo como nula e verificando isso na AsyncTask antes de dispensar.... em minha AsyncTask:
fonte
Depois de lutar contra esse problema, finalmente acabo com esta solução alternativa:
Às vezes, um bom tratamento de exceções funciona bem se não houver uma solução melhor para esse problema.
fonte
Se você tiver um
Activity
objeto por perto, pode usar oisDestroyed()
método:Isso é bom se você tiver uma
AsyncTask
subclasse não anônima que você usa em vários lugares.fonte
Estou usando uma classe estática personalizada que cria e oculta uma caixa de diálogo. esta classe está sendo usada por outras atividades também, não apenas uma atividade. Agora, o problema que você descreveu também apareceu para mim e eu passei a noite para encontrar uma solução
Finalmente apresento a solução!
se você deseja mostrar ou descartar uma caixa de diálogo e não sabe qual atividade iniciou a caixa de diálogo para tocá-la, o código a seguir é para você.
fonte
A solução acima não funcionou para mim. Então, o que fiz foi tomar
ProgressDialog
globalmente e adicionar isso à minha atividadede modo que, caso a atividade seja destruída, o ProgressDialog também será destruído.
fonte
Para a pergunta 1):
Considerando que a mensagem de erro não parece dizer qual linha do seu código está causando o problema, você pode rastreá-lo usando pontos de interrupção. Os pontos de interrupção pausam a execução do programa quando o programa chega a linhas de código específicas. Adicionando pontos de interrupção a locais críticos, você pode determinar qual linha de código causa o travamento. Por exemplo, se seu programa está travando em uma linha setContentView (), você pode colocar um ponto de interrupção lá. Quando o programa for executado, ele fará uma pausa antes de executar essa linha. Se a continuação fizer com que o programa trave antes de atingir o próximo ponto de interrupção, você saberá que a linha que matou o programa estava entre os dois pontos de interrupção.
Adicionar pontos de interrupção é fácil se você estiver usando o Eclipse. Clique com o botão direito na margem à esquerda do código e selecione "Alternar ponto de interrupção". Em seguida, você precisa executar seu aplicativo no modo de depuração, o botão que se parece com um inseto verde ao lado do botão de execução normal. Quando o programa atinge um ponto de interrupção, o Eclipse muda para a perspectiva de depuração e mostra a linha que está esperando. Para iniciar o programa em execução novamente, procure o botão 'Continuar', que se parece com um 'Play' normal, mas com uma barra vertical à esquerda do triângulo.
Você também pode preencher seu aplicativo com Log.d ("Meu aplicativo", "Algumas informações aqui que indicam onde está a linha de log"), que então posta mensagens na janela LogCat do Eclipse. Se você não conseguir encontrar essa janela, abra-a com Window -> Show View -> Other ... -> Android -> LogCat.
Espero que ajude!
fonte
Eu adicionei o seguinte ao manifesto dessa atividade
fonte
de acordo com o código do windowManager (link aqui ), isso ocorre quando a visualização que você está tentando atualizar (que provavelmente pertence a uma caixa de diálogo, mas não é necessária) não está mais anexada à raiz real das janelas.
como outros sugeriram, você deve verificar o status da atividade antes de realizar operações especiais em seus diálogos.
aqui está o código relevante, que é a causa do problema (copiado do código-fonte do Android):
fonte
Meu problema foi resolvido bloqueando a rotação da tela no meu Android, o aplicativo que estava me causando um problema agora funciona perfeitamente
fonte
Outra opção é não iniciar a tarefa assíncrona até que a caixa de diálogo seja anexada à janela, substituindo onAttachedToWindow () na caixa de diálogo, dessa forma sempre será descartável.
fonte
Ou simplesmente você pode adicionar
o que tornará o
ProgressDialog
não cancelávelfonte
Por que não tentar pegar, assim:
fonte
quando você declara atividade no manifesto, você precisa do android: configChanges = "orientação"
exemplo:
fonte