¿Qué es este error y por qué sucede?
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
fuente
fuente
Respuestas:
Intenta mostrar un cuadro de diálogo después de salir de una actividad.
[EDITAR]
Esta pregunta es una de las principales búsquedas en Google para desarrolladores de Android, por lo tanto, agrega algunos puntos importantes de los comentarios, lo que podría ser más útil para el futuro investigador sin profundizar en la conversación de comentarios.
Respuesta 1 :
Respuesta 2
Respuesta 3
fuente
La solución es llamar
dismiss()
alDialog
que creóviewP.java:183
antes de salirActivity
, por ejemplo, enonPause()
. Todos losWindow
s &Dialog
s deben cerrarse antes de dejar unActivity
.fuente
Si está utilizando
AsyncTask
, probablemente ese mensaje de registro puede ser engañoso. Si busca en su registro, puede encontrar otro error, probablemente uno en sudoInBackground()
métodoAsyncTask
, que está haciendo que su corrienteActivity
explote y, por lo tanto, una vez queAsyncTask
regrese ... bueno, ya sabe el resto. Algunos otros usuarios ya explicaron eso aquí :-)fuente
doInBackground
de laAsyncTask
clase, pero sin declarar en elAndroidManifest
archivo usando la propiedadandroid:name
de esta manera:android:name="my.package.MyApplicationClass"
. Una buena práctica al usarloAsyncTask
es recordar siempre instanciar su alerta dentro del métodoonPreExecute
y descartarlaonPostExecute
.Activé este error al llamar por error en
hide()
lugar dedismiss()
en unAlertDialog
.fuente
Puede obtener esta excepción simplemente por un error simple / tonto, al (por ejemplo) llamar accidentalmente
finish()
después de haber mostrado unaAlertDialog
, si pierde una declaración de interrupción de llamada en una declaración de cambio ...¡El
finish()
método cerrará elActivity
, peroAlertDialog
todavía se muestra!Entonces, cuando esté mirando fijamente el código, buscando problemas de subprocesamiento o codificación compleja y demás, no pierda de vista el bosque por los árboles. A veces puede ser algo tan simple y tonto como una declaración de ruptura faltante. :)
fuente
Las respuestas a esta pregunta fueron correctas, pero un poco confuso para que yo realmente entienda por qué. Después de jugar durante unas 2 horas, la razón de este error (en mi caso) me golpeó:
Ya sabe, al leer otras respuestas, que el
X has leaked window DecorView@d9e6131[]
error tiene significa que se abrió un cuadro de diálogo cuando se cerró la aplicación. ¿Pero por qué?Podría ser que su aplicación se bloqueó por alguna otra razón mientras su diálogo estaba abierto
Esto condujo al cierre de su aplicación debido a algún error en su código, que llevó al diálogo a permanecer abierto al mismo tiempo que su aplicación se cerró debido al otro error.
Entonces, mira a través de tu lógica. Resuelve el primer error, y luego el segundo error se resolverá solo
¡Un error causa otro, que causa otro, como DOMINOS!
fuente
Este problema surge cuando intenta mostrar un cuadro de diálogo después de salir de una actividad.
Acabo de resolver este problema simplemente escribiendo el siguiente código:
Básicamente, desde qué clase comenzaste progressDialog, reemplaza el método onDestroy y hazlo de esta manera. Se resolvió el problema "La actividad ha filtrado ventana".
fuente
Recientemente me enfrenté al mismo problema.
La razón detrás de este problema es que la actividad se cierra antes de cerrar el diálogo. Hay varias razones para que suceda lo anterior. Los mencionados en las publicaciones anteriores también son correctos.
Me metí en una situación, porque en el hilo, estaba llamando a una función que arrojaba una excepción. Debido a que la ventana se estaba descartando y, por lo tanto, la excepción.
fuente
Descartar el diálogo cuando la actividad destruye
fuente
Esto podria ayudar.
fuente
Tenía el mismo oscuro mensaje de error y no tenía idea de por qué. Dadas las pistas de las respuestas anteriores, cambié mis llamadas no GUI a mDialog.finish () para ser mDialog.dismiss () y los errores desaparecieron. Esto no estaba afectando el comportamiento de mi widget, pero era desconcertante y bien podría haber estado señalando una pérdida de memoria importante.
fuente
Estaba recibiendo estos registros en mi aplicación de reproductor de video. Estos mensajes fueron lanzados mientras el reproductor de video estaba cerrado. Curiosamente, solía obtener estos registros una vez en algunas ejecuciones de manera aleatoria. Además, mi aplicación no implica ninguna
progressdialog
. Finalmente, solucioné este problema con la siguiente implementación.Anule la
OnPause
llamada amVideoView.pause()
y el conjuntovisibility
aGONE
. De esta manera podría resolver el "Activity has leaked window
" problema de error de registro.fuente
Estaba teniendo el mismo problema y encontré esta página, y aunque mi situación era diferente, llamé
finish
desde unif
bloque antes de definir el cuadro de alerta.Entonces, simplemente llamar
dismiss
no funcionaría (ya que aún no se ha hecho), pero después de leer la respuesta de Alex Volovoy y darse cuenta de que fue el cuadro de alerta lo que causó. Traté de agregar una declaración de devolución justo después del final dentro de eseif
bloque y eso solucionó el problema.Pensé que una vez que llamaste terminar, detuvo todo y terminó allí, pero no lo hace. Parece que va al final del bloque de código en el que está y luego termina.
Por lo tanto, si desea implementar una situación en la que a veces terminará antes de hacer algún código, debe colocar una declaración de devolución justo después del final o continuará y actuará como se llamó al final al final del bloque de código no donde lo llamaste. Es por eso que estaba recibiendo todos esos errores extraños.
Si no coloca la devolución justo después de que llamé terminar allí, actuará como si la hubiera llamado después del
alert.show();
y, por lo tanto, diría que la ventana se filtra al terminar justo después de que aparezca el cuadro de diálogo, aunque eso sea No es el caso, todavía piensa que es.Pensé que agregaría esto aquí, ya que esto muestra que el comando de acabado actuó de manera diferente, entonces pensé que lo hizo y supongo que hay otras personas que piensan lo mismo que yo antes de descubrir esto.
fuente
Esta no es la respuesta a la pregunta, pero es relevante para el tema.
Si la actividad ha definido un atributo en el Manifiesto
luego, después de ejecutar onPause (), el contexto de actividad se pierde. Por lo tanto, todas las vistas que usan este contexto pueden dar este error.
fuente
progessdialog.show()
... yprogressdialog.hide()
enasynctask
la misma actividad en lugar deonPause()
desdeactivity
? echa un vistazo a mi problema ... stackoverflow.com/questions/39332880/…No solo intenta mostrar una alerta, sino que también se puede invocar cuando finaliza una instancia particular de actividad e intenta iniciar una nueva actividad / servicio o intenta detenerla.
Ejemplo:
fuente
En general, este problema se produce debido al diálogo de progreso: puede resolverlo utilizando cualquiera de los siguientes métodos en su actividad:
fuente
Tuve el problema donde terminé una actividad cuando todavía se mostraba un ProgressDialog.
Entonces, primero oculte el Diálogo y luego termine la actividad.
fuente
Prueba este código:
fuente
progressdialog.dismiss();
Esto puede crear NullPointerException.Esto puede ser si tiene un error en la
doInBackground()
función y tiene este código.Intenta agregar un diálogo por fin. Al principio verifica y corrige la
doInBackground()
funciónfuente
Esto me sucedió cuando estoy usando
ProgressDialog
enAsyncTask
. En realidad estoy usando elhide()
método enonPostExecute
. Sobre la base de la respuesta de @Alex Volovoy necesito utilizardismiss()
conProgressDialog
para eliminarlo en onPostExecute y su hecho.fuente
AsyncTask
y muestra elDialog
, entonces sucede algo que hace laActivity
llamadaonPause()
(tal vez algo de lógica en su AsyncTask en sí, como un oyente, entonces se filtrará. 2) Como se mencionó anteriormente, loDialog
que se creó con esoActivity
Context
nunca es despedido y losActivity
movimientos en adelante.El "
Activity has leaked window that was originally added...
" error se produce cuando intenta mostrar una alerta después de que elActivity
es efectivafinished
.Tienes dos opciones AFAIK:
dismiss()
aldialog
antes realmente salir de su actividad.dialog
en un hilo diferente y ejecútelothread
(independientemente de la corrienteactivity
).fuente
Aquí hay una solución cuando desea cerrar AlertDialog pero no desea mantener una referencia a él dentro de la actividad.
la solución requiere que tengas androidx.lifecycle dependencia de en tu proyecto (creo que en el momento del comentario es un requisito común)
esto le permite delegar el descarte del cuadro de diálogo en un objeto externo (observador), y ya no necesita preocuparse por él, porque se cancela automáticamente cuando la actividad muere. (aquí está la prueba: https://github.com/googlecodelabs/android-lifecycles/issues/5 ).
entonces, el observador mantiene la referencia al diálogo, y la actividad mantiene la referencia al observador. cuando ocurre "onPause" - el observador cierra el diálogo, y cuando ocurre "onDestroy" - la actividad elimina al observador, por lo que no ocurre ninguna fuga (bueno, al menos ya no veo ningún error en logcat)
fuente
Las excepciones de ventana filtrada tienen dos razones:
1) mostrando el cuadro de diálogo cuando no existe el contexto de la actividad, para resolver esto, debe mostrar el cuadro de diálogo solo si está seguro de que existe la actividad:
2) no descarte el diálogo adecuadamente, para resolver use este código:
fuente
Tienes que hacer
Progressdialog
objeto enonPreExecute
método deAsyncTask
y deberíasdismiss
hacerlo enonPostExecute
método.fuente
La mejor solución es agregar un cuadro de diálogo en el cuadro de diálogo intentar capturar y descartar cuando se produzca una excepción
fuente
dialog.dismiss()
va a producir el error demasiadoEn mi caso, la razón fue que olvidé incluir un permiso en el archivo de manifiesto de Android.
¿Cómo me enteré? Bueno, al igual que @Bobby dice en un comentario debajo de la respuesta aceptada, solo desplácese más arriba hasta sus registros y verá la primera razón o evento que realmente arrojó la Excepción. Aparentemente, el mensaje "La ventana de actividad se filtró que se agregó originalmente" es solo una Excepción que resultó de la primera Excepción.
fuente
Pruebe el siguiente código, funcionará cada vez que cierre el diálogo de progreso y verá si su instancia está disponible o no.
fuente
La mejor solución es poner esto antes de mostrar
progressbar
oprogressDialog
fuente
Solo asegúrese de que su actividad no se cierre inesperadamente debido a algunas excepciones generadas en algún lugar de su código. Generalmente ocurre en una tarea asincrónica cuando la actividad enfrenta un cierre forzado en el método doinBackground y luego asynctask regresa al método onPostexecute.
fuente
Tengo otra solución para esto, y me gustaría saber si le parece válido: en lugar de descartar en onDestroy, que parece ser la solución principal, estoy extendiendo ProgressDialog ...
Esto es preferible, AFAIC, porque no tienes que mantener el diálogo de progreso como miembro, solo dispara (muestra) y olvida
fuente