保持对对话框的引用的问题

issue with holding reference to a dialog

假设我有一个 activity

public class ClassA extends Activity {

protected void onCreate(Bundle savedInstanceState)
{
    ....
}

onCreate 我创建了一个 class 的对象,它扩展了 AsyncTask:

MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog
classB.execute();

MyAsynctaskonPostExecute 中,我想显示一个对话框。

protected void onPostExecute(Void result) {

    Dialog myCustomDialog = new Dialog(activityContext);
    ...
    myCustomDialog.show();
}

现在我有以下问题:

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

问题:

1) 保存对对话框的有效引用的好方法是什么,这样我就可以在创建 [=17 的新实例之前调用 myCustomDialog.dismiss() =] 因此一个新的 dialog?

2)myCustomDialog.dismiss() 清除强引用以便 GC 能够完成他的工作并且我不再泄漏内存了吗?或者我是否需要在关闭对话框后将强引用设置为类似这样的内容:myCustomDialog = null?

我对 android 比较陌生,我想学习如何完成这种情况的良好模式:)

感谢任何帮助。

您的对话框应该有一个 class 级别变量。

然后你有几个处理它的选项。在 onResume and/or onDestroy 中,您可以检查它是否不为 null 并相应地关闭它。

这取决于您希望对话框的行为方式。如果对话框出现然后 phone 响起,当用户 returns 时它是否仍然可见?如果 Android 在 phone 调用期间终止了您的应用程序,然后在用户完成它时重建它怎么办?

另外,旋转后的对话框是否应该"reappear"?在这种情况下,您也应该覆盖 onConfigurationChanged 以处理该问题:

How to use onConfigurationChanged() and newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE in android 2.3.3

至于 "leaking" - 如果您不介意内存消耗,只要 activity 没有被 GC,那么引用 activity 就是不是问题。如果您真的担心,可以在 activity 生命周期期间将对象设置为 null。

我可能会做这样的事情,有点啰嗦。

Class答:

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();
        }
    });
}

ClassB:

protected void onPostExecute(Void result) {

    classAReference.showDialog();
}