处理 Android 个上下文被破坏的对话框

Handlind Android dialog whos context is destroyed

我有一个 class 可以处理对话框的创建并在我的应用程序中显示。

它有一个作为 class 成员的对话框和一个具有以下几行的方法:

public static void setAlertDialog(String title, final Context con, boolean dialogCancelable)
{
    if(myDialog == null)
    {
        myDialog = new Dialog(con);
    ...
}

上下文会在一段时间后被销毁(通过应用程序的操作,这意味着它并不罕见),然后我得到一个异常

Unable to add window – token android.os.BinderProxy@422d2228 is not valid; is your activity running?

由于对话框保持同一个实例,建议执行以下操作的修复将不起作用:

if(!((Activity)con).isFinishing())
{
        myDialog.show();
}

我暂时修复了它,每次使用它时只需创建一个新的对话框实例。

问题是我的修复是否可以,或者是否有更好的方法来处理这种情况?

我需要更多关于如何调用 setAlertDialog 和显示对话框的上下文。由于 activity 正在被销毁,听起来对话框可能是从异步任务中显示的。

此外,您将对话框保留为实例变量的原因是什么?通常这样做是为了在暂停或销毁 Activity 时清理对话框。

TlDr;你的修复听起来不错。

长版(做出一些假设):

根据我的经验,您通常希望同时创建和显示对话框。如果您不想多次创建对话框(并且您不打算在创建对话框和显示对话框之间破坏 Activity),则类似以下内容应该有效:

if(!((Activity) context).isFinishing()){
  if (myDialog == null) {
    myDialog = new Dialog(context);
  }
  myDialog.show();
}

然后将以下内容添加到 Activity 以确保对话框已清理:

@Override
protected void onDestroy() {
  // Dismiss any dialogs to avoid leaking windows.
  if (myDialog != null && myDialog.isShowing()) {
    myDialog.dismiss();
    // This is optional, but would keep you from having the context
    // issue if you are still having it and don't mind re-creating
    // the dialog each time.
    myDialog = null;
  }

  super.onDestroy();
}