处理 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();
}
我有一个 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();
}