Android 自定义对话框的内存问题
我有一个完全定制的应用程序对话框(包括标题、按钮等)。我已经完成了对Dialog类的扩展,它可以正常显示和工作,但它会泄漏创建时所消耗的所有内存 这是它的核心:Android 自定义对话框的内存问题,android,android-layout,Android,Android Layout,我有一个完全定制的应用程序对话框(包括标题、按钮等)。我已经完成了对Dialog类的扩展,它可以正常显示和工作,但它会泄漏创建时所消耗的所有内存 这是它的核心: public class MyDialog extends Dialog { public MyDialog(Context context, String title) { super(context, R.style.MyDialog); setContentView(R.layout.my_
public class MyDialog extends Dialog {
public MyDialog(Context context, String title) {
super(context, R.style.MyDialog);
setContentView(R.layout.my_dialog);
}
}
我以这种方式在活动中创建了一个实例:
MyDialog dialog = new MyDialog(this);
dialog.show
根据android工程师的说法,在非常不可取的情况下,你必须传递活动的引用,而不是上下文,这真的很奇怪:
我已尝试通过以下方式在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));
private void unbindDrawable(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}
((视图组)视图);
}
}
...
不可绑定的drawables(dialog.findviewbyd(R.id.dialog_容器));
它有一些效果,一些内存被释放,但不是全部
我最近在为ListView定制行时也遇到了内存问题,我认为它们是相关的
我错过什么了吗?我犯了一个可怕的错误吗?或者这在Android上是常见的吗?尝试在您的unbindDrawables方法中调用方法
为什么不将应用程序上下文而不是活动传递给MyDialog构造函数?这样:
MyDialog dialog = new MyDialog(getApplicationContext());
尝试在unbindDrawables方法中调用方法
为什么不将应用程序上下文而不是活动传递给MyDialog构造函数?这样:
MyDialog dialog = new MyDialog(getApplicationContext());
我来看看回收会发生什么,谢谢。关于应用程序上下文,这只是一件奇怪的事情。如果在创建对话框时传递应用程序上下文,则会出现一个异常:ERROR/AndroidRuntime(26833):由以下原因引起:android.view.WindowManager$BadTokenException:无法添加窗口--token null不适用于应用程序为了使对话框正常工作,您必须传递对活动的引用,而且,它没有文档记录,Android API什么也没说。哦,是的,对不起,那是一只老虫子。那么,请确保没有保存对传递给构造函数的活动的任何引用。recycle()不起作用,我也没有在MyDialog类中保存对该活动的任何引用。无论如何,对活动的引用保存在Dialog类中,看看它的代码:所以,最后,我认为这个问题没有解决方案。Android中的对话框只适合使用其本机UI,因为它占用的内存很少。不管怎样,你可以自己建立自己的对话,但这是令人失望的。顺便问一下,您是否调用了
活动。removeDialog(int)
?我会看看回收会发生什么,谢谢。关于应用程序上下文,这只是一件奇怪的事情。如果在创建对话框时传递应用程序上下文,则会出现一个异常:ERROR/AndroidRuntime(26833):由以下原因引起:android.view.WindowManager$BadTokenException:无法添加窗口--token null不适用于应用程序为了使对话框正常工作,您必须传递对活动的引用,而且,它没有文档记录,Android API什么也没说。哦,是的,对不起,那是一只老虫子。那么,请确保没有保存对传递给构造函数的活动的任何引用。recycle()不起作用,我也没有在MyDialog类中保存对该活动的任何引用。无论如何,对活动的引用保存在Dialog类中,看看它的代码:所以,最后,我认为这个问题没有解决方案。Android中的对话框只适合使用其本机UI,因为它占用的内存很少。不管怎样,你可以自己建立自己的对话,但这是令人失望的。顺便说一句,谢谢你,你打电话给Activity.removeDialog(int)?