Android ilegal excepción cuando el cuadro de diálogo está mostrando

Tengo registro del desplome:

java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21f9ba68 VE.... R.....ID 0,0-1136,402} not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:402) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:328) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84) at android.app.Dialog.dismissDialog(Dialog.java:433) at android.app.Dialog.dismiss(Dialog.java:416) at ys.a(ConfirmationDialog.java:82) at ys.a(ConfirmationDialog.java:76) at **com.smarttech.kapp.SnapshotActivity.onOptionsItemSelected(SnapshotActivity.java:147)** at android.app.Activity.onMenuItemSelected(Activity.java:3036) at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:373) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1222) at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:155) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894) at android.widget.ActionMenuView.invokeItem(ActionMenuView.java:611) at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:197) at android.view.View.performClick(View.java:5217) at android.view.View.onKeyUp(View.java:9663) at android.widget.TextView.onKeyUp(TextView.java:7047) at android.view.KeyEvent.dispatch(KeyEvent.java:3171) at android.view.View.dispatchKeyEvent(View.java:8876) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2671) at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1787) at android.app.Activity.dispatchKeyEvent(Activity.java:2837) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2549) at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4661) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4616) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4174) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4227) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4193) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4303) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4201) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4360) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4174) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4227) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4193) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4201) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4174) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4227) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4193) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4336) at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4500) at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2607) at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2201) at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2192) at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2584) at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:143) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:6117) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Este es el código sorulate de mostrar el diálogo en la actividad de la instantánea:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.snapshot_delete: Log.d(TAG, "delete snapshot"); **delete();** return true; case R.id.snapshot_share: export(); return true; } return super.onOptionsItemSelected(item); } private void delete() { Log.d(TAG, "Delete snapshot"); final int index = pager.getCurrentItem(); ConfirmationDialog.prompt(this, R.string.delete_snapshot, R.string.delete_snapshot_confirmation, R.string.delete, android.R.string.cancel, new Runnable() { @Override public void run() { snapshots.get(index).delete(); loadSnapshots(); } }); } 

Este accidente es muy difícil de reproducir y es toda la información lo que tengo. ¿Cuál es la razón de esta excepción? ¿Y cómo se puede arreglar? Creo que la razón es hilo en el diálogo, pero no estoy seguro

 public static void prompt(final Context context, int titleResourceId, int questionResourceId, int positiveButton, int negativeButton, final Runnable confirmedRunnable, final Runnable cancelledRunnable) { closeDialog(); DialogInterface.OnClickListener confirmed = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { currentDialog = null; confirmedRunnable.run(); } }; DialogInterface.OnClickListener cancelled = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { currentDialog = null; if (cancelledRunnable != null) { cancelledRunnable.run(); } }; }; currentDialog = new AlertDialog.Builder(context).setTitle(titleResourceId).setMessage(questionResourceId).setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(positiveButton, confirmed) .setNegativeButton(negativeButton, cancelled).show(); currentDialog.setCancelable(cancelled == null); currentDialog.setCanceledOnTouchOutside(cancelled == null); } 

Esta es la implementación promt

El nivel superior de su stacktrace le está diciendo lo que está mal:

 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21f9ba68 VE.... R.....ID 0,0-1136,402} not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:402) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:328) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84) at android.app.Dialog.dismissDialog(Dialog.java:433) at android.app.Dialog.dismiss(Dialog.java:416) 

Usted está llamando a descartar en un diálogo que actualmente no se muestra más. Como en: su Actividad / Fragmento es posiblemente ya destruido cuando usted llama despedir (-> "no adjunta al administrador de ventanas").

[Editar] Una forma de solucionar esto es comprobar si activity.isFinishing () o fragment.isAdded ()

Por favor, desestime lo siguiente

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

Una forma sencilla de despedir su diálogo de forma segura es comprobar si la vista que contiene el cuadro de diálogo está mostrándose antes de intentar descartarla. Esto se parece a:

 if (view.isShown()) { dialog.dismiss() } 

No veo ninguna razón por la que la aplicación entera debería chocar con algo como esto. Me parece que una excepción en este punto debe ser el resultado de la actividad que ya ha terminado o algo. En cualquier caso supongo que el usuario no está mirando el diálogo por más tiempo, así que he hecho simple utilidad para cerrar mis diálogos silenciosamente.

 import android.app.Dialog; import android.util.Log; import java.io.PrintWriter; import java.io.StringWriter; public class DialogUtil { public static final String TAG = "DialogUtil"; public static void safeDismiss(Dialog dialog) { if (dialog != null && dialog.isShowing()) { try { dialog.dismiss(); } catch (RuntimeException ex) { StringWriter sw = new StringWriter(); ex.printStackTrace(new PrintWriter(sw)); Log.e(TAG, sw.toString()); } } } } 

Sugiero, también debe comprobar si la actividad no es nula.

 if (activity != null && progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } 
  • Android - Estilo AlertDialog
  • ¿Cómo aplicar el tema ligero para la actividad y mantener el tema oscuro para los diálogos al mismo tiempo?
  • No se puede descartar el diálogo con botones personalizados
  • Desenfocar el fondo detrás de AlertDialog
  • Diseño personalizado para el elemento Spinner
  • Actividad de Android ha filtrado ventana com.android.internal.policy.impl.phonewindow $ decorview Issue
  • Android AlertDialog reglas setView
  • Android AlertDialog con fondo transparente
  • La actividad ha filtrado la ventana en el método alertDialog show ()
  • OnCancelListener no se llama en DialogFragment
  • Android Image Dialog / Popup
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.