如何最大限度地减少Android活动中的漏洞

如何最大限度地减少Android活动中的漏洞,android,android-layout,Android,Android Layout,我在每个活动中都加载了很多位图。在活动之间切换后,我收到了很多“java.lang.OutOfMemoryError”。我的应用程序主要是面向potrait的 我尝试了许多解决方案,并在这个网站上的一个解决方案中找到了一个相对更好的方法 首先,在XML布局的父视图上设置“id”属性: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.c

我在每个活动中都加载了很多位图。在活动之间切换后,我收到了很多“java.lang.OutOfMemoryError”。我的应用程序主要是面向potrait的

我尝试了许多解决方案,并在这个网站上的一个解决方案中找到了一个相对更好的方法

首先,在XML布局的父视图上设置“id”属性:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:id="@+id/RootView"
 >

然后,在活动的onDestroy()方法中,调用unbindDrawables()方法,将引用传递给父视图,然后执行System.gc()操作

@覆盖
受保护的空onDestroy(){
super.ondestory();
不可绑定的drawables(findviewbyd(R.id.RootView));
gc();
}
私有void未绑定可提取项(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}
((视图组)视图);
}
}
但是它并没有完全删除
java.lang.OutOfMemoryError
。现在我随机得到了这个内存异常。我读了一些帖子,说要完全消除这个问题,你必须从代码中加载位图,然后在ActivityOnDestroy中释放它们。在我的例子中,这不是一个实用的解决方案,因为我加载了很多位地图

有没有人能更好地解决这个问题


谢谢

您是如何加载/存储位图的?请尝试使用ddms分析内存泄漏。我只通过xml设置了图像,并且图像位于drawable文件夹中。我遇到了相同的错误,但它尝试使用位图将图像设置为imageview并尝试回收。仍然有OOM!我认为问题在于您依赖onDestroy()它很少被调用(如果有的话)。文档中说你不保证onDestroy会被调用,有时系统甚至不调用它就杀死了你的应用。也许你应该把这段代码放在暂停/暂停中
@Override
    protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    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();
        }
    }