2
我为我的应用程序(包括标题,按钮等)有一个完全自定义的对话框。我已经完成了扩展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
这很古怪,你必须通过参考的活动,而不是上下文,当这是一个强烈的不应该的东西,根据机器人工程师:
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上平常的东西?
我会看看回收会发生什么,谢谢。关于应用程序上下文,这只是奇怪的事情。如果您在创建对话框时传递应用程序上下文,则会得到一个异常:ERROR/AndroidRuntime(26833):引起:android.view.WindowManager $ BadTokenException:无法添加窗口 - 标记null不适用于应用程序 为了使工作成为对话框而传递对活动的引用,更重要的是,它没有记录,Android API什么都没说。 http://developer.android.com/reference/android/app/Dialog.html#Dialog(android.content.Context) – 2012-01-12 17:52:57
噢,对不起,这是一个老bug。那么,确保你不保存传递给构造函数的任何引用。 – 2012-01-12 21:53:20
recycle()不起作用,我不保存任何对MyDialog类中活动的引用。无论如何,对活动的引用保存在Dialog类中,请查看其代码:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1 /android/app/Dialog.java#Dialog所以,最后,我认为这个问题没有解决方案。 Android中的对话只适用于其本地用户界面,因为它消耗的内存很少。无论如何,你可以自己建立自己的对话框,但是令人失望。谢谢 – 2012-01-13 09:21:26