我有一个处理对话框创建并在我的应用程序中显示的类。
它有一个对话框作为类成员和一个方法,它有以下几行:
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();
}
我现在修复了它,每次使用它时都只需创建一个新的对话框实例。
问题是我的修复是否正常或是否有更好的方法来处理这种情况?
答案 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();
}