Error: BinderProxy @ 45d459c0 no es válido; esta corriendo tu actividad?

¿Qué es este error? No he encontrado ninguna discusión sobre este error en la comunidad de stackoverflow. Detallada:

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 android.os.BinderProxy@45d459c0 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) 

Es muy probable que esto ocurra porque está intentando 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 en algunas de mis aplicaciones cuando la actividad que llamaba al cuadro de diálogo terminaba por alguna razón u otra cuando intentaba mostrar un diálogo. Esto es lo que me solucionó:

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

He estado usando esto para solucionar el problema en las versiones anteriores de Android durante varios años, y no he visto el colapso desde entonces.

mira este enlace:
Android: visualización de cuadros de diálogo desde hilos de fondo

Enfrenté el mismo problema y usé el código propuesto por DiscDev con cambios menores de la siguiente manera:

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

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

 public void onFinish() { GameOver(); } 

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

La solución a esto es bastante simple. Simplemente prueba 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 aquí

si el diálogo es trowing este problema debido al hilo que debe hacer ejecutar esto en el hilo UI de esa manera: –

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

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

Entonces, como usted comprende, Messenger fue serializado junto con sus campos (incluido el contexto), porque es la única forma de pasar objetos usando Intent – para serializarlos. En ese momento cuando Messenger pasó 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 Resumir (), que 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 objeto nuevo, que es completamente diferente de la original.

La solución es vincular el servicio cada vez que lo necesite y devolver una carpeta que tenga un método como ‘setMessenger (Messenger Messenger)’ y llámelo, cuando esté vinculado al servicio.