O que é esse erro e por que isso acontece?
05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850): at dalvik.system.NativeStart.main(Native Method)
android
memory-leaks
dialog
Pentium10
fonte
fonte
Respostas:
Você está tentando mostrar um diálogo depois de sair de uma atividade.
[EDITAR]
Esta questão é uma das principais pesquisas no google para desenvolvedores Android, portanto, adicionando alguns pontos importantes dos comentários, que podem ser mais úteis para futuros investigadores sem aprofundar a conversa sobre os comentários.
Resposta 1 :
Resposta 2
Resposta 3
fonte
A solução é chamar
dismiss()
o queDialog
você criouviewP.java:183
antes de sairActivity
, por exemplo, emonPause()
. Todos osWindow
s &Dialog
s devem ser fechados antes de sair de umActivity
.fonte
Se você estiver usando
AsyncTask
, provavelmente essa mensagem de log pode ser enganosa. Se você procurar no seu log, poderá encontrar outro erro, provavelmente um no seudoInBackground()
métodoAsyncTask
, que está fazendo sua correnteActivity
explodir e, assim que elaAsyncTask
voltar ... bem, você sabe o resto. Alguns outros usuários já explicaram isso aqui :-)fonte
doInBackground
daAsyncTask
classe, mas sem declará-la noAndroidManifest
arquivo usando a propriedadeandroid:name
como esta:android:name="my.package.MyApplicationClass"
. Uma boa prática ao usá-AsyncTask
lo é sempre lembrar de instanciar seu alerta dentro do métodoonPreExecute
e descartá-loonPostExecute
.Acionei esse erro chamando por engano em
hide()
vez dedismiss()
em umAlertDialog
.fonte
Você pode obter essa exceção apenas com um erro simples / burro, ligando acidentalmente
finish()
depois de exibir umAlertDialog
, se você perder uma declaração de chamada de interrupção em uma declaração de chave ...O
finish()
método fechará oActivity
, masAlertDialog
ainda está sendo exibido!Portanto, quando você estiver olhando atentamente para o código, procurando problemas de encadeamento ou codificação complexa, não perca de vista a floresta para as árvores. Às vezes, pode ser algo tão simples e burro quanto uma declaração de pausa ausente. :)
fonte
As respostas para essa pergunta estavam todas corretas, mas um pouco confusas para eu realmente entender o porquê. Depois de brincar por cerca de 2 horas, o motivo desse erro (no meu caso) me atingiu:
Você já sabe, ao ler outras respostas, que o
X has leaked window DecorView@d9e6131[]
erro possui significa que uma caixa de diálogo foi aberta quando o aplicativo foi fechado. Mas por que?Pode ser que seu aplicativo tenha travado por algum outro motivo enquanto a caixa de diálogo estava aberta
Isso levou ao fechamento do seu aplicativo devido a algum erro no seu código, que levou a caixa de diálogo a permanecer aberta ao mesmo tempo em que o aplicativo foi fechado devido a outro erro.
Então, olhe através da sua lógica. Resolva o primeiro erro e, em seguida, o segundo erro se resolverá
Um erro causa outro, o que causa outro, como DOMINOS!
fonte
Esse problema surge ao tentar mostrar uma caixa de diálogo depois que você sai de uma atividade.
Eu apenas resolvi esse problema escrevendo o código a seguir:
Basicamente, a partir de qual classe você iniciou progressDialog, substitua o método onDestroy e faça o seguinte. Ele resolveu o problema "A atividade vazou pela janela".
fonte
Recentemente, enfrentei o mesmo problema.
A razão por trás desse problema é que a atividade está sendo fechada antes que a caixa de diálogo seja descartada. Existem várias razões para que isso aconteça. Os mencionados nas postagens acima também estão corretos.
Entrei em uma situação, porque no thread eu estava chamando uma função que estava lançando uma exceção. Por causa disso a janela estava sendo fechada e, portanto, a exceção.
fonte
Ignorar a caixa de diálogo quando a atividade destruir
fonte
Isso poderia ajudar.
fonte
Eu tinha a mesma mensagem de erro obscura e não fazia ideia do porquê. Dadas as dicas das respostas anteriores, mudei minhas chamadas não GUI para mDialog.finish () para mDialog.dismiss () e os erros desapareceram. Isso não estava afetando o comportamento do meu widget, mas era desconcertante e poderia muito bem estar sinalizando um importante vazamento de memória.
fonte
Eu estava recebendo esses logs no meu aplicativo player de vídeo. Essas mensagens foram lançadas enquanto o player de vídeo estava fechado. Curiosamente, eu costumava obter esses logs uma vez em algumas execuções de maneira aleatória. Além disso, meu aplicativo não envolve em nenhum
progressdialog
. Finalmente, resolvi esse problema com a implementação abaixo.Substitua a
OnPause
chamada commVideoView.pause()
e o conjuntovisibility
comoGONE
. Dessa forma, eu poderia resolver o "Activity has leaked window
" problema de erro de log.fonte
Eu estava tendo o mesmo problema e encontrei esta página e, enquanto minha situação era diferente, liguei
finish
de umif
bloco antes de definir a caixa de alerta.Então, simplesmente ligar
dismiss
não funcionaria (como ainda não foi feito), mas depois de ler a resposta de Alex Volovoy e perceber que era a caixa de alerta que a causava. Tentei adicionar uma declaração de retorno logo após a conclusão dentro desseif
bloco e que corrigiu o problema.Pensei que depois que você ligasse para terminar, parasse tudo e terminasse ali, mas não. Parece que vai para o final do bloco de código em que está e termina.
Portanto, se você deseja implementar uma situação em que, às vezes, ele termina antes de executar algum código, é necessário colocar uma declaração de retorno logo após o término ou ele continua e continua agindo como se o término tivesse sido chamado no final do bloco de código não onde você o chamou. É por isso que eu estava recebendo todos esses erros estranhos.
Se você não colocar o retorno logo depois que eu chamei de terminar lá, ele funcionará como se você tivesse chamado depois
alert.show();
e, portanto, diria que a janela vazou ao terminar logo após você fazer a caixa de diálogo aparecer, mesmo que seja não é o caso, ainda acha que é.Eu pensei em adicionar isso aqui, pois isso mostra que o comando final agiu de maneira diferente do que eu pensava e acho que há outras pessoas que pensam o mesmo que eu antes de descobrir isso.
fonte
Esta não é a resposta para a pergunta, mas é relevante para o tópico.
Se a atividade tiver definido um atributo no Manifest
depois de executar onPause (), o contexto da atividade é perdido. Portanto, todas as visualizações que usam esse contexto podem gerar esse erro.
fonte
progessdialog.show()
.. eprogressdialog.hide()
noasynctask
da mesma atividade em vez deonPause()
partiractivity
?? ter um olhar para o meu problema ... stackoverflow.com/questions/39332880/...Além de tentar mostrar um alerta, ele também pode ser chamado quando você termina uma instância específica de atividade e tenta iniciar uma nova atividade / serviço ou tenta pará-lo.
Exemplo:
fonte
Geralmente esse problema ocorre devido à caixa de diálogo de progresso: você pode resolver isso usando qualquer um dos métodos a seguir em sua atividade:
fonte
Tive o problema de terminar uma atividade quando ainda era mostrado um ProgressDialog.
Então, primeiro oculte a caixa de diálogo e depois termine a atividade.
fonte
Tente este código:
fonte
progressdialog.dismiss();
isso pode criar NullPointerException.Isso pode ocorrer se você tiver um erro na
doInBackground()
função e tiver esse código.Tente adicionar a caixa de diálogo, finalmente. Na primeira
doInBackground()
função de verificação e correçãofonte
Isso aconteceu comigo quando eu estou usando
ProgressDialog
noAsyncTask
. Na verdade, eu estou usando ohide()
métodoonPostExecute
. Com base na resposta de @Alex Volovoy eu preciso usardismiss()
comProgressDialog
para removê-lo em OnPostExecute e seu feito.fonte
AsyncTask
e mostra oDialog
, acontece algo que faz aActivity
chamadaonPause()
(talvez alguma lógica no seu AsyncTask, como um ouvinte, ele vaze. 2) Como mencionado acima, oDialog
que foi criado com eleActivity
Context
nunca é demitido e osActivity
movimentos.O
Activity has leaked window that was originally added...
erro " " ocorre quando você tenta mostrar um alerta depois que eleActivity
é efetivamentefinished
.Você tem duas opções AFAIK:
dismiss()
para odialog
antes de realmente sair do seu atividade.dialog
em um thread diferente e execute-othread
(independente da correnteactivity
).fonte
Aqui está uma solução quando você deseja descartar o AlertDialog, mas não deseja manter uma referência a ele dentro da atividade.
solução requer que você tenha androidx.lifecycle dependência no seu projeto (acredito que no momento do comentário é um requisito comum)
isso permite delegar a dispensa da caixa de diálogo a um objeto externo (observador), e você não precisa mais se preocupar com isso, porque ela é cancelada automaticamente quando a atividade morre. (aqui está a prova: https://github.com/googlecodelabs/android-lifecycles/issues/5 ).
portanto, o observador mantém a referência ao diálogo e a atividade mantém a referência ao observador. quando "onPause" acontece - o observador rejeita a caixa de diálogo e quando "onDestroy" acontece - a atividade remove o observador, portanto não ocorre vazamento (bem, pelo menos não vejo mais erro no logcat)
fonte
As exceções que vazaram na janela têm dois motivos:
1) mostrando a caixa de diálogo quando o Contexto da Atividade não existe, para resolver isso, você deve mostrar a caixa de diálogo apenas para ter certeza de que a Atividade existe:
2) não descartar o diálogo adequadamente, para resolver, use este código:
fonte
Você deve criar um
Progressdialog
objeto noonPreExecute
método deAsyncTask
e devedismiss
fazê-lo noonPostExecute
métodofonte
A melhor solução é apenas adicionar uma caixa de diálogo na tentativa de capturar e descartar a caixa de diálogo quando ocorrer uma exceção
fonte
dialog.dismiss()
vai produzir erro tambémNo meu caso, o motivo foi que esqueci de incluir uma permissão no arquivo de manifesto do Android.
Como eu descobri? Bem, assim como o @Bobby diz em um comentário abaixo da resposta aceita, basta ir até seus logs e você verá o primeiro motivo ou evento que realmente gerou a exceção. Aparentemente, a mensagem "A atividade vazou na janela que foi adicionada originalmente" é apenas uma exceção que resultou de qualquer que seja a primeira exceção.
fonte
Tente o código abaixo, ele funcionará sempre que você descartar o diálogo de progresso e verificar se a instância está disponível ou não.
fonte
A melhor solução é colocar isso antes de mostrar
progressbar
ouprogressDialog
fonte
Apenas verifique se sua atividade não está sendo fechada inesperadamente devido a algumas exceções levantadas em algum lugar do seu código. Geralmente isso acontece na tarefa assíncrona quando a atividade enfrenta o fechamento forçado no método doinBackground e, em seguida, a asynctask retorna ao método onPostexecute.
fonte
Eu tenho outra solução para isso e gostaria de saber se parece válido para você: em vez de dispensar o onDestroy, que parece ser a solução líder, estou estendendo o ProgressDialog ...
Isso é preferível, AFAIC, porque você não precisa manter o diálogo de progresso como membro, apenas dispare (mostre) e esqueça
fonte