Vista no adjunta al administrador de ventanas, diálogo despedido

Así que tengo la actividad llamada GameActivity.java y en esta actividad llamo DialogAnswer.show() que muestra sencilla alguna imagen en la pantalla.

 java.lang.IllegalArgumentException: View not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:402) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:304) at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:79) at android.app.Dialog.dismissDialog(Dialog.java:325) at android.app.Dialog.dismiss(Dialog.java:307) at pl.evelanblog.prawdaczyfalsz.screen.DialogAnswer$1.onFinish(DialogAnswer.java:36) at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5328) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) at dalvik.system.NativeStart.main(Native Method) 

Esta es mi clase DialogAnswer.java

 public class DialogAnswer extends Activity { private static ImageView resultImage; private static Dialog dialog = null; public static void show(Context context, boolean fCorrect) { dialog = new Dialog(context, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); dialog.setContentView(R.layout.dialog); resultImage = (ImageView) dialog.findViewById(R.id.result_image); if (fCorrect) resultImage.setImageResource(R.drawable.correct_image); else resultImage.setImageResource(R.drawable.incorrect_image); dialog.show(); new CountDownTimer(700, 100) { public void onTick(long millisUntilFinished) { } public void onFinish() { dialog.dismiss(); //this is line 36 } }.start(); } } 

Cuando el GameActivity.java veces, cuando voy a otra actividad im obtener un error como este en la parte superior de mi publicación. No sé cómo resolver esto, es difícil de depurar porque su error raro, pero existe.

Utilice una instrucción try.

 new CountDownTimer(700, 100) { public void onTick(long millisUntilFinished) { } public void onFinish() { try { dialog.dismiss(); dialog = null; } catch (Exception e) { //TODO: Fill in exception } } }.start(); 

Un montón de gente puede ser google este, así que podría poner mi 2p en:

Desafortunadamente, los ejemplos en los que la gente está usando isShowing () no van a funcionar, ya que esto puede devolver true cuando la vista se separa (la actividad ha desaparecido).

Si usted es perezoso, el otro comentario de los carteles sobre envolverlo en un intento {} también trabaja en / most / situations (aunque hay algunos casos donde el sistema puede cerrarlo y una excepción todavía dará lugar a un cierre de la fuerza que No puedes poner un try {} round como sucede en el código android, no tuyo)

La mejor solución es cerrar los diálogos cuando la actividad termine / cierre. Si intenta cerrarlo después de que el usuario se aleje mientras su tarea asíncrona se está ejecutando (o, el teléfono suena y se desvía para ellos), entonces obtendrá la excepción ViewNotAttached.

Antes de despedir el cheque como esto en onDestroy() o onStop() method..You es simple despedir no comprobar si está mostrando o no

 if (mDialog!=null) { if (mDialog.isShowing()) { mDialog.dismiss(); } } 

Haz esto

 new CountDownTimer(700, 100) { public void onTick(long millisUntilFinished) { } public void onFinish() { runOnUiThread(new Runnable() { @Override public void run() { dialog.dismiss(); //this is line 36 } }); } }.start(); 

El uso de try catch puede no ser una manera eficiente de resolver este problema, ya que puede causar pérdida de memoria; Para esta pregunta, ya que el contexto se utiliza como param, por lo que antes de usar el código dialog.dismiss, podemos utilizar los códigos a continuación para proteger:

 public void onFinish() { if{ctx instanceof Activity && !((Activity)ctx.isfinishing()){ dialog.dismiss(); //this is line 36 } } 

También, se puede utilizar otro método para corregir este fallo en la función de onDestroy () en la actividad, agregue el código:

 protected void onDestroy() { if(dialog != null){ dialog.dismiss(); dialog = null; } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.