错误:BinderProxy @ 45d459c0无效; 你的活动正在运行?

什么是这个错误…我还没有发现任何关于这个错误在stackoverflow社区的讨论详细:

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) 

这是最有可能发生的,因为你正试图在后台线程执行后显示一个对话框,而活动正在被销毁。

我看到这个错误,偶尔从我的一些应用程序中报告,当调用对话的活动由于某种原因完成时,当它试图显示一个对话框。 以下是我解决这个问题的方法:

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

我已经使用这个在几年前解决了旧版Android的问题,并且从那以后就没有看到崩溃。

检查这个链接:
Android – 从后台线程显示对话框http://dimitar.me/android-displaying-dialogs-from-background-threads/

我遇到了同样的问题,并使用了上面提到的DiscDev代码,并做了如下小修改:

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

当我的应用程序中有一个countDownTimer时,我遇到了这个错误。 它有一个在我的应用程序中调用GameOver的方法

 public void onFinish() { GameOver(); } 

但实际上由于用户点击错误(这是一个点击游戏),游戏可能会在时间到来之前结束。 所以当我在例如20秒之后查看游戏结束对话框时,我忘记取消countDownTimer所以一旦时间到了,对话框又出现了。 或者出于某种原因与上述错误坠毁。

解决这个问题非常简单。 只要testing活动是否正在经过其完成阶段,然后显示对话框:

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

在这里看到更多

在我的情况下,问题是Context在扩展Handler的类中被保留为一个弱引用。 然后,我通过一个Intent传递给Service Messenger ,包装处理程序。 我每次都在onResume()方法的屏幕上显示活动。

所以,正如你所理解的,messenger和它的字段(包括上下文)一起被序列化,因为它是使用Intent传递对象的唯一方式 – 序列化它们。 而在那个时候,当信使传递给服务时,活动本身还没有准备好显示对话,因为它在另一个状态(被称为onResume(),这与活动已经在屏幕上时是完全不同的)。 所以当信使被反序列化时,上下文仍然处于恢复状态,而活动实际上已经在屏幕上了。 另外,反序列化为新对象分配内存,这与原来完全不同。

所以,解决scheme就是在每次需要的时候绑定到服务上,并返回绑定器,这个绑定器有一个类似“setMessenger(Messenger messenger)”的方法,然后在绑定到服务时调用它。