无法添加窗口 – 令牌android.os.BinderProxy无效; 你的活动正在运行?

我尝试通过Facebook API连接到Facebook,我按照这个例子: https : //github.com/facebook/facebook-android-sdk/tree/master/examples/simple

一切正常,但是当我尝试编辑一些代码,我的意思是我想要显示对话框后的消息login成功,如下所示:

public void onAuthSucceed() { mText.setText("You have logged in! "); //This is the code to call the post message dialog. mFacebook.dialog(Example.this, "feed",new SampleDialogListener()); } 

我在logcat中收到这个错误:

 03-02 13:32:08.629: E/AndroidRuntime(14991): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405180f8 is not valid; is your activity running? 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.ViewRoot.setView(ViewRoot.java:532) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.Window$LocalWindowManager.addView(Window.java:424) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.app.Dialog.show(Dialog.java:241) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Facebook.dialog(Facebook.java:780) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Facebook.dialog(Facebook.java:737) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Example$SampleAuthListener.onAuthSucceed(Example.java:113) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.SessionEvents.onLoginSuccess(SessionEvents.java:78) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Example$LoginDialogListener.onComplete(Example.java:88) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Facebook$1.onComplete(Facebook.java:320) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:144) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:218) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:337) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.os.Handler.dispatchMessage(Handler.java:99) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.os.Looper.loop(Looper.java:130) 03-02 13:32:08.629: E/AndroidRuntime(14991): at android.app.ActivityThread.main(ActivityThread.java:3687) 03-02 13:32:08.629: E/AndroidRuntime(14991): at java.lang.reflect.Method.invokeNative(Native Method) 03-02 13:32:08.629: E/AndroidRuntime(14991): at java.lang.reflect.Method.invoke(Method.java:507) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 03-02 13:32:08.629: E/AndroidRuntime(14991): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 03-02 13:32:08.629: E/AndroidRuntime(14991): at dalvik.system.NativeStart.main(Native Method) 

任何想法?

当您显示不再存在的上下文的对话框时,可能会发生这种情况。 一个常见的情况 – 如果“显示对话框”操作是在asynchronous操作之后,并且在该操作期间,原始活动(即对话框的父代)将被销毁。 对于一个很好的描述,请参阅这篇博文和评论:

http://dimitar.me/android-displaying-dialogs-from-background-threads/

从上面的堆栈跟踪看来,Facebook库asynchronous地分离了auth操作,并且你有一个Handler-Callback机制(在一个监听器上调用onComplete)可以很容易的创build这个场景。

当我看到这个报告在我的应用程序,这是非常罕见的,匹配的博客文章的经验。 在AsyncTask的工作过程中,活动发生了错误/被破坏了。 我不知道你的修改每次都可能导致这种情况,但是也许你正在引用一个Activity作为你的代码执行时总是被销毁的对话框的上下文?

另外,虽然我不确定这是否是最好的方法来判断您的活动是否正在运行,请参阅以下答案:

检查活动是否有效

我看到这个错误报告了一段时间,从我的一些应用程序,这是什么解决了我:

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

除此之外,所有其他答案似乎都在做奇怪的事情,比如遍历正在运行的活动列表,但是这样做更简单,而且看起来是可以做到的。

本网站列出了3种不同的方法来检查某个Activity是否正在运行,并提供代码片段来帮助您。 但是,请记住,检查一个活动是否仍在运行只是为了debugging的目的,因为它的结果是确定的,因此不适合代码/逻辑stream程。

我面对完全相同的问题。 调用'(!isFinishing())'防止了崩溃,但是它不能显示'alert'消息。

然后我试着调用函数“static” ,在那里显示alert。 之后,没有发生崩溃,消息也正在显示。

例如:

 public static void connect_failure() { Log.i(FW_UPD_APP, "Connect failed"); new AlertDialog.Builder(MyActivity) .setTitle("Title") .setMessage("Message") .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //do nothing } }) .setIcon(R.drawable.the_image).show(); }