我的应用程序有一个完全自定义的对话框(包括标题,按钮等)。我已经完成了扩展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上常见的东西吗?
答案 0 :(得分:0)
尝试在unbindDrawables方法中调用recycle()
方法。
为什么不将应用程序上下文而不是活动传递给MyDialog构造函数?这样:
MyDialog dialog = new MyDialog(getApplicationContext());