2011-07-01 18 views
10

Tengo un problema donde recibo un BadTokenException cuando la pantalla se agota y el usuario vuelve a mi aplicación. Tengo un botón que abre un ContextMenu al hacer clic.BadTokenException: no se puede agregar la ventana

Funciona bien normalmente, pero cuando el usuario deja que la pantalla expire el tiempo de espera y luego vuelve a la aplicación, se emite un BadTokenException.

07-01 14:46:42.763: WARN/WindowManager(1105): Attempted to add window with token that is a sub-window: [email protected] Aborting. 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.View.showContextMenu(View.java:2444) 
    07-01 14:46:42.771: WARN/System.err(1725):  at com.??.??.ui.cards.ViewActivity$3.onClick(ViewActivity.java:353) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.View.performClick(View.java:2408) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.View$PerformClick.run(View.java:8816) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.os.Handler.handleCallback(Handler.java:587) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.os.Handler.dispatchMessage(Handler.java:92) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.os.Looper.loop(Looper.java:123) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
    07-01 14:46:42.771: WARN/System.err(1725):  at java.lang.reflect.Method.invokeNative(Native Method) 
    07-01 14:46:42.771: WARN/System.err(1725):  at java.lang.reflect.Method.invoke(Method.java:521) 
    07-01 14:46:42.771: WARN/System.err(1725):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    07-01 14:46:42.771: WARN/System.err(1725):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    07-01 14:46:42.771: WARN/System.err(1725):  at dalvik.system.NativeStart.main(Native Method) 
    07-01 14:46:43.005: WARN/System.err(1725): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewRoot.setView(ViewRoot.java:505) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.app.Dialog.show(Dialog.java:241) 
    07-01 14:46:43.005: WARN/System.err(1725):  at com.android.internal.view.menu.MenuDialogHelper.show(MenuDialogHelper.java:86) 
    07-01 14:46:43.005: WARN/System.err(1725):  at com.android.internal.view.menu.ContextMenuBuilder.show(ContextMenuBuilder.java:88) 
    07-01 14:46:43.005: WARN/System.err(1725):  at com.android.internal.policy.impl.PhoneWindow$DecorView.showContextMenuForChild(PhoneWindow.java:1860) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 

Si detectar la excepción, el botón no se abre el menú contextual en este caso, pero otros controles de la página siguen trabajando.

Si puedo minimizar la aplicación con la pantalla de inicio y, a continuación, vuelva, la aplicación se bloquea con el siguiente traza:

07-01 15:10:50.439: ERROR/AndroidRuntime(1931): FATAL EXCEPTION: main 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): java.lang.NullPointerException 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.view.WindowManagerImpl.removeViewLocked(WindowManagerImpl.java:239) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.view.WindowManagerImpl.closeAll(WindowManagerImpl.java:293) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3687) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread.access$2900(ActivityThread.java:125) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.os.Looper.loop(Looper.java:123) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at dalvik.system.NativeStart.main(Native Method) 

Así es como estoy añadiendo la contextMenu

b.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (contextMenuOpen) return;// popup options 
       contextMenuOpen = view.showContextMenu(); 

      } 

I no llame a registerForContextMenu con el botón, sino a la vista principal. ¿Es esto incorrecto?

Respuesta

13

Está aferrándose a una referencia a un contexto (explícitamente, o al crear un cuadro de diálogo o un brindis o algún otro elemento dependiente) que se ha destruido (normalmente porque está usando el onCreateDialog o le pasó la actividad a algunos otro proceso que no se destruyó cuando se destruyó la actividad).

+0

Gracias por su respuesta. ¿Te importa mirar mi edición a la publicación original y asegurarte de que sea válida? Recibo una referencia válida a la Vista dentro de la función onClick. –

+0

Eso realmente no es suficiente para decir lo que está haciendo mal: realmente necesitaría ver más de su código para determinar detalles. Lo que podría intentar es mover la llamada 'setOnClickListener' en la devolución de llamada' onResume' para la Actividad (asegúrese de estar llamando al método de la superclase también cuando invalide 'onResume') y vea si todavía tiene el problema. – Femi

+0

Terminé resolviendo esto por ahora, a través de una ruta diferente que probablemente no se aplicaría a nadie más, y no solucioné el problema, así que no lo explicaré aquí. Gracias –

0

Cuando llamé al método showContextMenu() simplemente en onResume capté la misma excepción. Resolví este problema usando Handler

@Override 
protected void onResume() { 
    super.onResume(); 

    if (contextMenuOpened) { 
     new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       choosePicBtn.showContextMenu(); 
      } 
     }); 
    } 
} 
Cuestiones relacionadas