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


116

我尝试通过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());   
    }

我在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)

任何想法?



1
检查下面的答案。我标记为正确:)
Han Tran 2014年

仅仅因为您已标记答案,就不会改变这是一个重复问题的事实。另一个首先被问到,并且是一个具有基本相同答案的相同问题。
bsara 2014年

1
您是否看到我的问题是2年前?
Han Tran 2014年

1
所以看起来其他主持人有错,但是您:))Anw,谢谢!
Han Tran 2014年

Answers:


127

当您显示对话框的上下文不再存在时,可能会发生这种情况。常见情况-如果“显示对话框”操作是在异步操作之后进行的,则在该操作过程中,原始活动(即对话框的父对象)将被破坏。有关详细说明,请参阅此博客文章和评论:

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

从上面的堆栈跟踪中可以看出,facebook库似乎异步地剥离了auth操作,并且您具有可以轻松创建此方案的Handler-Callback机制(在监听器上调用onComplete)。

当我在我的应用程序中看到此报告时,它很少见并且与博客文章中的经验相符。活动出错,在AsyncTask工作期间该活动被销毁。我不知道您的修改每次都会导致这种情况,但是也许您将“活动”作为对话框的上下文引用,而该上下文始终在代码执行时被破坏?

另外,虽然我不确定这是否是判断您的活动是否正在运行的最佳方法,但请参见以下答案以获取一种方法:

检查活动是否活跃


3
不打电话dialog.show()可以解决问题,但是仍然可以显示我的对话框该怎么办?
natsumiyu

对我来说,我正在调用Fragment.getContext(),它适用于21以上的API。但是在Lollipop上,它崩溃了
TheRealChx101 '19

158

我偶尔从我的某些应用程序中看到此错误报告,以下是为我解决的问题:

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

所有其他答案似乎都在做一些奇怪的事情,例如遍历正在运行的活动列表,但这要简单得多,而且似乎可以解决问题。


6
它不能解决问题,还可以防止崩溃和显示对话框
YTerle

6
请记住,您应该检查一下,context instanceof Activity否则您可能会得到Exception
FtheBuilder

3
或者您可以使用getActivity()。isFinishing()代替上下文
Nikita Axyonov

我正在使用API​​-23。当我尝试在扩展AppCompatActivity的MainActivity中使用此功能时。它向我显示了类似的错误,原因如下:java.lang.ClassCastException:com.creativeapp.hindihdvideosongs.AppController无法在com.creativeapp.hindihdvideosongs.MainActivity.onCreate(MainActivity.java:145)上转换为android.app.Activity。添加到我的AndroidMenifest中
pavel

我没有使用任何对话并收到此错误。
Abdul Waheed

10

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

try {
        alertDialog.show()
    }
catch (WindowManager.BadTokenException e) {
        //use a log message
    }

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


如此丑陋又如此美丽!
拉胡尔·蒂瓦里

8
  • 就我而言,发生此问题是因为试图在onPostExecuteAsyncTask中打开/显示对话框

  • 但是,它的错误方法showing dialog或Ui会发生变化onPostExecute

  • 为此,我们需要检查活动是否处于活动Eg:中 !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());
                            }
                        }
                    }
                });
    }

1

我面临着完全相同的问题。调用可以'(!isFinishing())'防止崩溃,但是无法显示“警报”消息。

然后,我尝试使调用函数“ static”(显示警报)。在那之后,没有崩溃发生并且消息也得到显示。

例如:

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();      
    }


1

另一个开发人员使用的情况下:如果WindowManager还是getWindow()被称为上onCreate()onStart()或者onResume(),一个BadTokenException被抛出。您将需要等待,直到准备好视图并附加了视图。

移动代码即可onAttachedToWindow()解决。它可能不是一个永久性的解决方案,但经过我的测试,它始终有效。

就我而言,当活动可见时,需要增加屏幕亮度。该生产线getWindow().getAttributes().screenBrightnessonResume()导致异常。将代码移到onAttachedToWindow()工作。



0

在dependencyServices之下,以上内容均无济于事,我最终如下所示:

    class Static_Toast_Android
    {
        private static Context _context
        {
            get { return Android.App.Application.Context; }
        }
        public static void StaticDisplayToast(string message)
        {
            Toast.MakeText(_context, message, ToastLength.Long).Show();
        }
    }
    public class Toast_Android : IToast
    {

        public void DisplayToast(string message)
        {
            Static_Toast_Android.StaticDisplayToast(message);
        }
    }

我必须使用“双重类”,因为接口不能是静态的。L-


0

无法添加窗口-令牌无效;您的活动正在进行吗?

此崩溃通常是由您的应用尝试使用先前完成的“活动”作为上下文来显示对话框时引起的。例如,如果活动触发一个AsyncTask并在完成时尝试显示对话框,但是用户在任务完成之前从该活动返回,则可能会发生这种情况。

外部资源

Android –从后台线程显示对话框

错误:BinderProxy @ 45d459c0无效;您的活动正在进行吗?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.