android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌android.os.BinderProxy@27773032无效;你的活动在运行吗?

时间:2016-08-17 05:59:35

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

错误:android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌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();
        }

输出:没有崩溃。但没有提醒

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

注意:必须显示警告。

1 个答案:

答案 0 :(得分:0)

这里发生了什么。在尝试显示警报之前,您有一个被杀死的活动 - 由于配置更改或由于活动自然结束。由于您的活动已停止,因此无权显示警报。因此例外。完成检查(或只是一个捕获和忽略)将通过不尝试显示警报来修复崩溃。

如果你的活动被正常杀死,那么这里没什么可做的。这是预期的,一个死活动不应该显示一个对话框。如果由于配置更改(如旋转)而重新创建,则新活动需要是显示对话框的活动。如果这是由于加载数据,则需要使用Loader或类似技术来确保旧活动可以从原始数据访问加载数据。这适用于来自服务器的任何异步数据 - 新的Activity需要是接收它的那个,而不是旧的。