【问题标题】:android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@27773032 is not valid; is your activity running?android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 android.os.BinderProxy@27773032 无效;您的活动正在运行吗?
【发布时间】:2016-08-17 05:59:35
【问题描述】:

错误 : android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@27773032 无效;您的活动正在进行吗?

代码

@Override
public void showInviteDialog(final IncomingInvite incomingInvite) {
    //  setCallAlert2(incomingInvite);

    runOnUiThread(new Runnable() {
        @Override
        public void run() {

            alertDialog = Dialog.createInviteDialog(incomingInvite.getInviter(),
                    acceptCallClickListener(incomingInvite), rejectCallClickListener(incomingInvite),
                    HomeActivity.this);
            alertDialog.show();
        }
    });

}

尝试过的解决方案

  if(!isFinishing()){

            alertDialog = Dialog.createInviteDialog(incomingInvite.getInviter(),
                    acceptCallClickListener(incomingInvite), rejectCallClickListener(incomingInvite),
                    HomeActivity.this);
            alertDialog.show();
        }

输出:没有崩溃。但没有警报

检查了类似的问题,但我没有找到任何确切的解决方案,所有这些都是为了避免崩溃(例如检查活动是否存在等)。不是为了显示警报。

注意:必须显示警报。

【问题讨论】:

    标签: android multithreading android-layout android-studio android-alertdialog


    【解决方案1】:

    这就是正在发生的事情。在您尝试显示警报之前,您有一个活动被终止 - 无论是由于配置更改还是由于活动自然结束。因为您的活动已失效,所以它无权显示警报。因此例外。完成检查(或只是捕获和忽略)将通过不尝试显示警报来修复崩溃。

    如果您的活动被正常终止,则此处无事可做。这是意料之中的,死活不应该显示对话框。如果由于配置更改(如旋转)而重新创建,那么新活动需要是显示对话框的活动。如果这是由于加载数据,您需要使用 Loader 或类似技术来确保旧活动可以访问原始活动的加载数据。这适用于来自服务器的任何异步数据 - 新的 Activity 需要接收它,而不是旧的。

    【讨论】:

    • 在服务中,加载数据。但活动和片段仍然可见.. isFinishing() 结果为真。
    • 您无法显示来自服务的对话框。您需要向 Activity 发送消息,并让它显示对话框。
    • 未显示来自服务的对话。从活动中显示的对话框。活动内的 showInviteDialog()
    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多