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

Han*_*ran 98 android facebook

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

一切都还可以,但是当我尝试编辑一些代码时,我的意思是我希望在登录成功后显示对话框发布消息,如下所示:

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());   
    }
Run Code Online (Sandbox Code Playgroud)

我在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)
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Dis*_*Dev 138

我看到我的一些应用程序偶尔会报告此错误,这就是为我解决的问题:

if(!((Activity) context).isFinishing())
{
    //show dialog
}
Run Code Online (Sandbox Code Playgroud)

所有其他答案似乎都在做一些奇怪的事情,比如遍历正在运行的活动列表,但这更简单,似乎可以解决问题.

  • 它没有解决问题,它可以防止崩溃和显示对话框 (6认同)
  • 只记得你应该检查`context instanceof Activity`,否则你可能会得到`例外'! (6认同)
  • 或者您可以使用getActivity().isFinishing()而不是上下文 (3认同)

Pet*_*ale 112

当您显示不再存在的上下文的对话框时,可能会发生这种情况.常见情况 - 如果'show dialog'操作在异步操作之后,并且在该操作期间,原始活动(即对话框的父级)将被销毁.有关描述的详细信息,请参阅此博客文章和评论:

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

从上面的堆栈跟踪看来,facebook库异步地旋转了auth操作,并且你有一个Handler - Callback机制(onConmplete在一个监听器上调用),可以很容易地创建这个场景.

当我在我的应用程序中看到这个报告时,它非常罕见并且与博客文章中的体验相匹配.活动出了问题/它在AsyncTask工作期间被销毁了.我不知道你的修改每次都会导致这种情况,但是你可能会引用一个Activity作为对话框的上下文,它总是在你的代码执行时被破坏?

此外,虽然我不确定这是否是判断您的活动是否正在运行的最佳方式,但请参阅此答案,了解一种方法:

检查活动是否有效

  • 不调用`dialog.show()`解决问题,但是能够仍然显示我的对话框的工作是什么? (3认同)

小智 16

一种简单的解决方法是捕获异常:

try {
        alertDialog.show()
    }
catch (WindowManager.BadTokenException e) {
        //use a log message
    }
Run Code Online (Sandbox Code Playgroud)

当您必须管理异步操作并且在想要显示对话框时不确定活动是否已启动时,这并不优雅但有时很容易。

  • 如此丑陋却又如此美丽! (4认同)

Agi*_*nbu 8

  • 在我的情况下,问题是因为我试图在onPostExecuteAsyncTask 中打开/显示对话框

  • 然而它的错误方法showing dialog或 Ui 在onPostExecute.

  • 为此,我们需要检查活动是否处于活动状态,例如: !isFinishing(),如果活动未完成,则只能显示我们的对话框或 ui 更改。

    @Override
    protected void onPostExecute(String response_str) {
    
       getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (!((Activity) mContext).isFinishing()) {
                            try {
                                ShowAgilDialog();
                            } catch (WindowManager.BadTokenException e) {
                                Log.e("WindowManagerBad ", e.toString());
                            }
                        }
                    }
                });
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 这可行,但是我们的对话框呢?如果它进入 catch 块,我们将无法显示它 (2认同)