自定义对话框的内存问题

时间:2012-01-12 16:52:40

标签: android android-layout

我的应用程序有一个完全自定义的对话框(包括标题,按钮等)。我已经完成了扩展Dialog类并且它显示并正常工作,但它泄漏了创建时消耗的所有内存。

这是它的核心:

public class MyDialog extends Dialog {
    public MyDialog(Context context, String title) {
        super(context, R.style.MyDialog);
        setContentView(R.layout.my_dialog);
    }   
}

我以这种方式在Activty中创建了一个实例:

MyDialog dialog = new MyDialog(this);
dialog.show

根据安卓工程师的说法,你必须传递Activity的引用,而不是Context,这是非常奇怪的,根据android工程师的说法:

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

我试图以这种方式在System.gc()之前解除对话视图的回调:

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null); 
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}


 ...

 unbindDrawables(dialog.findViewById(R.id.dialog_container));

它有一些效果,一些记忆被释放,但不是全部。

我最近也有自定义ListView行的内存问题,我认为它们是相关的。

我错过了什么吗?我犯了一个可怕的错误吗?或者它是Android上常见的东西吗?

1 个答案:

答案 0 :(得分:0)

尝试在unbindDrawables方法中调用recycle()方法。

为什么不将应用程序上下文而不是活动传递给MyDialog构造函数?这样:

MyDialog dialog = new MyDialog(getApplicationContext());