持有对话框引用的问题

时间:2015-01-13 15:59:41

标签: android memory-leaks dialog

假设我有一个activity

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();
<{1>} onPostExecute MyAsynctask我希望显示一个对话框。

protected void onPostExecute(Void result) {

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

现在我有以下问题:

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

问题:

1)保持对话框的有效引用有什么好方法,这样我才能在创建myCustomDialog.dismiss()的新实例之前调用MyAsynctask,因此新dialog

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

我对android很新,我想学习如何完成这个场景的好模式:)

我感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

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

这取决于您希望对话框的行为方式。如果对话框出现然后电话响了,用户返回时是否仍然可以看到?如果Android在通话过程中杀死了您的应用,然后在用户完成后重新构建了该怎么办?

此外,如果对话框重新出现&#34;轮换后?在这种情况下,你应该覆盖onConfigurationChanged以便处理它:

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

至于&#34;泄漏&#34; - 只要活动不是GC,你就不会记住内存消耗,那么引用活动不是问题。如果您真的担心,可以在活动生命周期中将对象设置为null。

答案 1 :(得分:0)

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

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

ClassB的:

protected void onPostExecute(Void result) {

    classAReference.showDialog();
}