2011-10-18 14 views
83

Qué es este error ... No he encontrado ninguna discusión sobre este error en la comunidad stackoverflow detallada: -Error: BinderProxy @ 45d459c0 no es válido; esta corriendo tu actividad?

10-18 23:53:11.613: ERROR/AndroidRuntime(3197): Uncaught handler: thread main exiting due to uncaught exception 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.ViewRoot.setView(ViewRoot.java:468) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.app.Dialog.show(Dialog.java:239) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at com.vishal.contacte.Locationlistener$MyLocationListener.onLocationChanged(Locationlistener.java:86) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:179) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:112) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:128) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.os.Looper.loop(Looper.java:123) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at dalvik.system.NativeStart.main(Native Method) 
+0

Posible duplicado de [No se puede agregar la ventana - token android.os.BinderProxy no es válido; esta corriendo tu actividad?] (https: // stackoverflow.com/questions/9529504/unable-to-add-window-token-android-os-binderproxy-is-not-valid-is-your-activ) – Pod

Respuesta

214

Esto es más probable sucediendo porque está tratando de mostrar un diálogo después de la ejecución de un hilo de fondo, mientras se destruye la actividad.

Estaba viendo este error informado de vez en cuando de algunas de mis aplicaciones cuando la actividad que llamaba al diálogo estaba terminando por alguna razón u otra cuando intentaba mostrar un diálogo. Esto es lo resuelto por mí:

if(!((Activity) context).isFinishing()) 
{ 
    //show dialog 
} 

He estado usando esto para evitar el problema en las versiones anteriores de Android desde hace varios años, y no he visto desde el accidente.

+0

¡Esto realmente hace el truco! pero, ¿hay alguna manera de abrir el diálogo incluso si eso sucede? No estoy seguro de cómo administrar el diálogo cuando esto sucede. ¿Alguna sugerencia? ¡Gracias por adelantado! –

+0

@CarlaStabile ¡Hola! La única forma en que puedo pensar en mostrar un diálogo cuando esto ocurra sería si puedes obtener un contexto válido para una actividad que no termina: dependerá de dónde llames este código y si tienes una forma de recuperar un código. contexto de otra actividad que no termina. – DiscDev

+3

¡Gracias a un millón! Para mí, el bloqueo (con el mensaje de error anterior) ocurriría cuando presioné el botón Atrás, antes de que se mostrara el cuadro de diálogo. Entonces el código continuaría y trataría de mostrarlo, a pesar de que estaba en una actividad diferente. ¡Pero esto detuvo el accidente y fui a la nueva actividad con facilidad! – Azurespot

1

Encontré este error cuando tenía un countDownTimer en mi aplicación. Tenía un método llamando GameOver en mi aplicación como

public void onFinish() { 
    GameOver(); 
} 

pero en realidad el juego podría haber terminado antes de que el tiempo se había terminado debido a un clic mal del usuario (que era un juego pulsando). Entonces, cuando estaba mirando el cuadro de diálogo Game Over luego de, por ejemplo, 20 segundos, olvidé cancelar el countDownTimer, así que una vez que se acabó el tiempo, el cuadro de diálogo apareció nuevamente. O se bloqueó con el error anterior por alguna razón.

4

que enfrentan el mismo problema y utiliza el código propuesto por DiscDev anterior con cambios menores de la siguiente manera:

if (!MainActivity.this.isFinishing()){ 
    alertDialog.show(); 
} 
+2

Hola, necesitas elaborar (codificar comentarios o publicar texto) sobre por qué cambiaste esto. Además, proporcione un enlace a la sugerencia en lugar del perfil del usuario. –

+0

cambié porque (Actividad) context significa MainActivity.this para mi caso. También tiene razón sobre el enlace del perfil de usuario, pero pensé que lo puede encontrar arriba. –

0

La solución a esto es bastante simple. Sólo probar si la actividad está pasando por su fase de acabado antes de mostrar el cuadro de diálogo:

private Handler myHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
    switch (msg.what) { 
     case DISPLAY_DLG: 
     if (!isFinishing()) { 
     showDialog(MY_DIALOG); 
     } 
     break; 
    } 
    } 
}; 

ver más here

0

En mi caso, el problema fue que Context se mantuvo como una referencia débil de la clase que se extiende Handler . Luego estaba pasando Messenger, que envuelve el controlador, a través de Intent a Service. Estaba haciendo esto cada vez que la actividad aparecía en la pantalla en el método onResume().

Así que, como usted entiende, el messenger fue serializado junto con sus campos (incluido el contexto), porque es la única forma de pasar objetos usando Intent - para serializarlos. Y en ese momento cuando se pasó el messenger al servicio, la actividad en sí misma todavía no estaba lista para mostrar diálogos ya que está en otro estado (se dice en Resume(), eso es absolutamente diferente de cuando la actividad ya está en la pantalla). Entonces, cuando Messenger se deserializó, el contexto aún estaba en el estado de reanudación, mientras que la actividad ya estaba en la pantalla. Además, la deserialización asigna memoria para un nuevo objeto, que es completamente diferente de la original.

Por lo tanto, la solución es vincular el servicio cada vez que lo necesite y devolver el enlace que tiene un método como 'setMessenger (Messenger Messenger)' y llamarlo, cuando esté vinculado al servicio.

Cuestiones relacionadas