2012-01-12 49 views
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上平常的东西?

回答

0

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

为什么不将活动传递给MyDialog构造函数?这样:

MyDialog dialog = new MyDialog(getApplicationContext()); 
+0

我会看看回收会发生什么,谢谢。关于应用程序上下文,这只是奇怪的事情。如果您在创建对话框时传递应用程序上下文,则会得到一个异常: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

+0

噢,对不起,这是一个老bug。那么,确保你不保存传递给构造函数的任何引用。 – 2012-01-12 21:53:20

+0

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