Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义对话框的内存问题_Android_Android Layout - Fatal编程技术网

Android 自定义对话框的内存问题

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_

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

这是它的核心:

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)?