Android 保留对对话框的引用时出现问题

Android 保留对对话框的引用时出现问题,android,memory-leaks,dialog,Android,Memory Leaks,Dialog,假设我有一个活动 public class ClassA extends Activity { protected void onCreate(Bundle savedInstanceState) { .... } 在onCreate中,我创建了一个类的对象,该类扩展了AsyncTask: MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog classB.execu

假设我有一个
活动

public class ClassA extends Activity {

protected void onCreate(Bundle savedInstanceState)
{
    ....
}
onCreate
中,我创建了一个类的对象,该类扩展了
AsyncTask

MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog
classB.execute();
MyAsynctask
onPostExecute
中,我想显示一个对话框

protected void onPostExecute(Void result) {

    Dialog myCustomDialog = new Dialog(activityContext);
    ...
    myCustomDialog.show();
}
现在我有以下问题:

例如,在旋转设备之后,将创建并执行
MyAsynctask
的新对象。那没关系,而且是我想要的方式!但是,如果用户在旋转设备之前未关闭先前引用的
MyAsynctask
对话框,则会在旧对话框上方显示一个新对话框,更糟糕的是,我正在泄漏内存

问题:

1)在创建
MyAsynctask
的新实例和新的
对话框之前,保存对该对话框的有效引用以便调用
myCustomDialog.dismise()
的好方法是什么

2)
myCustomDialog.disclose()
清除强引用,以便GC能够完成其工作,并且不再泄漏内存?或者,在取消对话框:
myCustomDialog=null
后,是否需要将强引用设置为如下内容

我对安卓系统还比较陌生,我想学习如何完成这个场景的好模式:)


非常感谢您的帮助。

您的对话框中应该有一个类级变量

然后你有几个处理它的选项。在
onResume
和/或
onDestroy
中,您可以检查它是否为空,并相应地将其取消

这取决于您希望对话框的行为方式。如果出现该对话框,然后电话铃响,当用户返回时,该对话框是否仍然可见?如果Android在通话过程中关闭了你的应用程序,然后在用户完成后重新构建它会怎么样

此外,旋转后对话框是否应“重新出现”?在这种情况下,您应该覆盖
onConfigurationChanged
,以处理该问题:


至于“泄漏”——如果您不介意内存消耗,只要活动不是GC'd的,那么对活动的引用就不是问题。如果您真的担心,可以在活动生命周期中将对象设置为null。

我可能会这样做,这有点冗长

A类:

private Dialog m_dialog = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    //Create the dialog
}

@Override
protected void onDestroy() {
    m_dialog.dismiss();
    m_dialog = null;
}

public void showDialog(){
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if(m_dialog != null)
                m_dialog.show();
        }
    });
}

public void hideDialog(){
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if(m_dialog != null)
                m_dialog.hide();
        }
    });
}
B类:

protected void onPostExecute(Void result) {

    classAReference.showDialog();
}

嗨,迈克,每次显示对话框时都需要创建吗?当得到一个轮换时,你倾向于得到一个oncreate/destroy。因此,如果在ondestroy上调用dialog.discouse()。它应该删除所有旧引用,以便您建议在“我的活动”中实例化
对话框
,并传递引用。在
onPostExecute
中,我自定义并显示它。这样,我就可以访问我的
活动中的有效引用
,在那里我可以在
onPause
onResume
中关闭对话框!另一个问题是,创建holer类作为参考是否有用?或者这不是一种推荐的方式?