Handlind Android对话框,上下文被破坏

时间:2016-12-26 08:59:20

标签: android android-context android-dialog

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

它有一个对话框作为类成员和一个方法,它有以下几行:

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

上下文可以在一段时间后销毁(通过应用程序的动作,这意味着它并不罕见),然后我得到一个例外

  

无法添加窗口 - 令牌android.os.BinderProxy@422d2228无效;你的活动在运行吗?

由于对话框仍然是同一个实例,因此建议执行以下操作的修复不起作用:

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

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

问题是我的修复是否正常或是否有更好的方法来处理这种情况?

1 个答案:

答案 0 :(得分:1)

我需要更多关于如何在显示对话框的同时调用setAlertDialog的上下文。由于活动正在被破坏,听起来好像对话框可能是从异步任务中显示的。

此外,您将对话框保持为实例变量的理由是什么?通常这样做是为了在暂停或销毁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();
}