" android.view.WindowManager $ BadTokenException"在AlertDialog.Builder上#显示即使有安全措施

时间:2018-04-22 02:05:29

标签: android android-activity alertdialog android-alertdialog android-fragmentactivity

我收到了android.view.WindowManager$BadTokenException例外情况,即使(我理解为所有必要的)保护措施也围绕创建和显示对话框。

这里等同于创建和显示对话框的代码:

public class MyFragmentActivity extends FragmentActivity

    public void handleErrorDialogOk() {
        ...
    }

    public void makeErrorDialog(){
        if (!isFinishing()){
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    if (isFinishing())
                        return;

                    new AlertDialog.Builder(MyFragmentActivity.this)
                        .setTitle("Some title")
                        .setMessage("Some message")
                        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                handleErrorDialogOk();
                            }
                        })
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .show();
                }
            });

        }
    }
}

我没有一直看到它,它似乎是随机的,我无法重现它(只在发布的应用程序的游戏商店的ANRs & crashes标签中看到它)。

我在这里做错了吗?

或者这可能是FragmentActivity的错误?我似乎没有看到任何来自标准AlertDialogs类派生的类实例的任何Activity ...

2 个答案:

答案 0 :(得分:0)

当您尝试在“活动”中创建对话框时,会发生异常,但“活动”已完成。窗口不再是可用的。所以,改变上下文:

 if(!context.isFinishing()){ 
 //FragmentActivity is the context
  builder.show();
  }

答案 1 :(得分:0)

在进一步检查Play商店的崩溃/ ANR数据后,我注意到这仅在特定的Android版本上发生;就像我最初在问题中指出的那样,它仅发生在从FragmentActivity派生的类上,这使我得出结论,在该Android版本上,FragmentActivity暗示中肯定存在某种错误,因为我我正在采取所有我认为是必要的预防措施,以避免针对破坏活动提出对话(这是造成此异常的常见原因)。