La actividad ha filtrado la ventana que se agregó originalmente

¿Qué es este error y por qué ocurre?

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.(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) 

    Está intentando 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, se agregan algunos puntos importantes de los comentarios, que podrían ser más útiles para el futuro investigador sin profundizar en la conversación de comentarios.

    Respuesta 1 :

    Está intentando mostrar un cuadro de diálogo después de salir de una actividad.

    Respuesta 2

    Este error puede ser un poco engañoso en algunas circunstancias (aunque la respuesta es completamente precisa), es decir, en mi caso se lanzó una excepción no controlada en una AsyncTask, que causó el cierre de la actividad, luego un diálogo de progreso abierto provocó esta excepción. la excepción ‘real’ fue un poco antes en el registro

    Respuesta 3

    Call dismiss () en la instancia de Diálogo que creó antes de salir de su Actividad, por ejemplo, en OnPause () o onDestroy ()

    La solución es llamar a onPause() en el onPause() Dialog que creó en viewP.java:183 antes de salir de la Activity , por ejemplo, en onPause() . Todas las Window y Dialog deben cerrarse antes de abandonar una Activity .

    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 su método doInBackground() de su AsyncTask , que está haciendo explotar su Activity actual, y por lo tanto una vez que la AsyncTask regrese … bueno, ya conoce la descanso. Algunos otros usuarios ya lo explicaron aquí 🙂

    Puede obtener esta excepción simplemente por un error simple / tonto, por ejemplo, al llamar accidentalmente a finish() después de haber mostrado un AlertDialog , si pierde una statement de interrupción en una statement de cambio …

      @Override public void onClick(View v) { switch (v.getId()) { case R.id.new_button: openMyAlertDialog(); break; < -- If you forget this the finish() method below will be called while the dialog is showing! case R.id.exit_button: finish(); break; } } 

    El método finish() cerrará la Activity , pero AlertDialog aún se muestra.

    Entonces, cuando miras fijamente el código, buscando problemas de subprocesamiento o encoding compleja, no pierdas de vista el bosque por los árboles. A veces puede ser algo tan simple y tonto como una statement de interrupción faltante. 🙂

    Desencadené este error al llamar erróneamente a hide() lugar de AlertDialog dismiss() en un AlertDialog .

    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:

     @Override public void onDestroy(){ super.onDestroy(); if ( progressDialog!=null && progressDialog.isShowing() ){ progressDialog.cancel(); } } 

    Básicamente, desde qué clase comenzó progressDialog, anule el método Destroy y hágalo de esta manera. Resolvió el problema de “Actividad ha escapado la ventana”.

    Recientemente me enfrenté al mismo problema.

    El motivo de este problema es que la actividad se cierra antes de descartar el diálogo. Hay varias razones para que lo anterior ocurra. 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 estaba arrojando una excepción. Debido a que la ventana estaba siendo rechazada y, por lo tanto, la excepción.

    Las respuestas a esta pregunta fueron todas correctas, pero un poco confusas para mí para entender realmente por qué. Después de jugar alrededor de 2 horas, el motivo de este error (en mi caso) me golpeó:

    Usted ya sabe, por leer otras respuestas, que la X has leaked window DecorView@d9e6131[] error significa que se abrió un cuadro de diálogo cuando se cerró su aplicación. ¿Pero por qué?

    Podría ser que tu aplicación se bloqueara por alguna otra razón mientras tu diálogo estaba abierto

    Esto conduce al cierre de su aplicación debido a algún error en su código, lo que hace que el diálogo permanezca abierto al mismo tiempo que la aplicación se cerró debido a otro error.

    Por lo tanto, mira a través de tu lógica. Resuelve el primer error, y luego el segundo error se resolverá solo enter image description here

    Un error causa otro, que causa otro, como DOMINOS!

    Tenía el mismo mensaje de error oscuro y no tenía idea de por qué. Dadas las pistas de las respuestas anteriores, cambié mis llamadas no-GUI a mDialog.finish () para que fuera mDialog.dismiss () y los errores desaparecieron. Esto no estaba afectando el comportamiento de mi widget, pero era desconcertante y podría haber estado marcando una importante pérdida de memoria.

    Estaba obteniendo estos registros en mi aplicación de reproductor de video. Estos mensajes se lanzaron mientras el reproductor de video estaba cerrado. Curiosamente, solía obtener estos registros una vez en algunas ejecuciones de forma aleatoria. Además, mi aplicación no implica ningún progressdialog . Finalmente, solucioné este problema con la implementación a continuación.

     @Override protected void onPause() { Log.v("MediaVideo", "onPause"); super.onPause(); this.mVideoView.pause(); this.mVideoView.setVisibility(View.GONE); } @Override protected void onDestroy() { Log.v("MediaVideo", "onDestroy"); super.onDestroy(); } @Override protected void onResume() { Log.v("MediaVideo", "onResume"); super.onResume(); this.mVideoView.resume(); } 

    Anular OnPause con una llamada a mVideoView.pause() y establecer la visibility a GONE . De esta forma podría resolver el error de registro de la ” Activity has leaked window “.

    Descartar el diálogo cuando la actividad destruya

     @Override protected void onDestroy() { super.onDestroy(); if (pDialog!=null && pDialog.isShowing()){ pDialog.dismiss(); } } 

    Estaba teniendo el mismo problema y encontré esta página, y aunque mi situación era diferente llamé a finish desde un bloque if antes de que definiera el cuadro de alerta.

    Por lo tanto, simplemente llamar a 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 era la caja de alerta la que lo provocaba. Traté de agregar una statement de devolución justo después del final dentro de ese bloque if y eso solucionó el problema.

    Pensé que una vez que llamaste terminó, detuvo todo y terminó allí mismo, pero no es así. Parece ir al final del bloque de código en el que termina.

    Por lo tanto, si desea implementar una situación en la que a veces termine antes de hacer algún código, debe poner una statement de retorno justo después de la terminación o continuará y actuará como si la finalización se hubiera realizado al final del proceso. bloque de código no donde lo llamaste. Por eso estaba recibiendo todos esos errores extraños.

     private picked(File aDirectory){ if(aDirectory.length()==0){ setResult(RESULT_CANCELED, new Intent()); finish(); return; } AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder alert .setTitle("Question") .setMessage("Do you want to open that file?"+aDirectory.getName()); alert .setPositiveButton("OK", okButtonListener) .setNegativeButton("Cancel", cancelButtonListener); alert.show(); } 

    Si no devuelve la devolución justo después de que llamé para finalizar, actuará como si la hubiera llamado después de alert.show(); y por lo tanto, diría que la ventana se ha filtrado al finalizar justo después de que haya aparecido el cuadro de diálogo, aunque ese no sea el caso, todavía cree que sí.

    Pensé en agregar esto como aquí, ya que esto muestra que el comando de finalización actuó de manera diferente, entonces pensé que sí y supongo que hay otras personas que piensan lo mismo que yo antes de descubrir esto.

    Esto podría ayudar.

     if (! isFinishing()) { dialog.show(); } 

    Esta no es la respuesta a la pregunta, pero es relevante para el tema.

    Si la actividad ha definido un atributo en el Manifiesto

      android:noHistory="true" 

    luego, después de ejecutar onPause (), el contexto de actividad se pierde. Entonces, todas las vistas que usan este contexto pueden dar este error.

    No solo intenta mostrar una alerta, sino que también se puede invocar cuando finaliza una determinada actividad e intenta iniciar una nueva actividad / servicio o intenta detenerla.

    Ejemplo:

     OldActivity instance; oncreate() { instance=this; } instance.finish(); instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class)); 

    Esto puede ser si tiene un error en la función doInBackground() y tiene este código.

    Intenta agregar un diálogo por fin. En la primera comprobación y corrección de la función doInBackground()

     protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(CreateAccount.this); pDialog.setMessage("Creating Product.."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } protected String doInBackground(String...args) { ERROR CAN BE IS HERE } protected void onPostExecute(String file_url) { // dismiss the dialog once done pDialog.dismiss(); 

    Esto me sucedió cuando estoy usando ProgressDialog en AsyncTask . En realidad estoy usando el método hide() en onPostExecute . Basado en la respuesta de @Alex Volovoy, necesito usar dismiss dismiss() con ProgressDialog para eliminarlo en onPostExecute y listo.

     progressDialog.hide(); // Don't use it, it gives error progressDialog.dismiss(); // Use it 

    Se Activity has leaked window that was originally added... error “La Activity has leaked window that was originally added... ” cuando intenta mostrar una alerta después de que la Activity finished efectiva.

    Tienes dos opciones AFAIK:

    1. Repiense el inicio de sesión de su alerta: call dismiss() en el dialog antes de salir de su actividad.
    2. Coloque el dialog en un hilo diferente y ejecútelo en ese thread (independientemente de la activity actual).

    Tuve el problema donde terminé una Actividad cuando todavía se mostraba un ProgressDialog.

    Primero, oculte el cuadro de diálogo y luego termine la actividad.

    Prueba este código:

     public class Sample extends Activity(){ @Override public void onCreate(Bundle instance){ } @Override public void onStop() { super.onStop(); progressdialog.dismiss(); // try this } } 

    Tienes que hacer Progressdialog objeto Progressdialog en el método AsyncTask de AsyncTask y debes dismiss en el método onPostExecute .

    La mejor solución es simplemente agregar un diálogo en try catch y dismiss dialog cuando ocurra una excepción

    Solo use el código debajo

      try { dialog.show(); } catch (Exception e) { dialog.dismiss(); } 

    En general, este problema se produce debido al diálogo de progreso: puede resolverlo mediante cualquiera de los siguientes métodos en su actividad:

      // 1): @Override protected void onPause() { super.onPause(); if ( yourProgressDialog!=null && yourProgressDialog.isShowing() ) { yourProgressDialog.cancel(); } } // 2) : @Override protected void onDestroy() { super.onDestroy(); if ( yourProgressDialog!=null && yourProgressDialog.isShowing() { yourProgressDialog.cancel(); } } 

    En 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, simplemente desplácese hacia 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 ha filtrado que se agregó originalmente” es solo una excepción que resulta de lo que sea la primera excepción.

    Pruebe el siguiente código, funcionará cada vez que cierre el diálogo de progreso y verá si su instancia está disponible o no.

     try { if (null != progressDialog && progressDialog.isShowing()) { progressDialog.dismiss(); progressDialog = null; } } catch (Exception e) { e.printStackTrace(); } 

    Solo asegúrese de que su actividad no se cierre inesperadamente debido a algunas excepciones planteadas en algún lugar de su código. Generalmente ocurre en una tarea asincrónica cuando la actividad enfrenta el cierre forzado en el método doinBackground y luego asynctask regresa al método OnPostexecute.

    Las excepciones filtradas de la ventana tienen dos razones:

    1) mostrando el cuadro de diálogo cuando el Contexto de la actividad no existe, para resolverlo debes mostrar el cuadro de diálogo solo, estás seguro de que existe la actividad:

     if(getActivity()!= null && !getActivity().isFinishing()){ Dialog.show(); } 

    2) no descarte el diálogo apropiadamente, para resolver use este código:

     @Override public void onDestroy(){ super.onDestroy(); if ( Dialog!=null && Dialog.isShowing() ){ Dialog.dismiss(); } } 
      if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } 

    El problema según mi es que estás tratando de llamar a un diálogo justo después de que se termine una actividad, así que, según mi opinión, lo que puedes hacer es demorar el uso de Handler y tu problema se resolverá, por ejemplo:

      Handler handler=new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { dialog.show(); //or dialog.dismiss(); } },100); 

    Tengo el mismo tipo de problema. el error no estaba en el Dialog sino en un EditText . Intentaba cambiar el valor del Edittext dentro de una Assynctask . lo único que podía resolver era crear un nuevo runnable .

     runOnUiThread(new Runnable(){ @Override public void run() { ... } });