Android内存泄漏? Bitmap超出了VM预算错误

时间:2012-11-01 13:38:48

标签: android android-fragments bitmap out-of-memory

我的应用程序包含几个片段,因为我在两个标签中显示它们。很少有碎片被分类到第一个选项卡中,很少被分类到另一个类别中,显示的是第二个选项卡。它还有很多图像可以从网上获取。我正在使用延迟加载图像概念,没有WeakReference或SoftReference到位图。应用程序非常好,没有任何问题。但如果我长时间操作,它就会崩溃。我跟踪堆更新并找到了下面的内容。

当我访问新片段时,堆大小正在增加,当从堆栈中删除它们时,堆大小不会减少。如果我访问旧片段,那么堆内存没有大量增加但仍然存在少量内存增加。为什么堆栈内存不会从堆栈中删除片段时回收内存。我正在跟踪所有片段的日志,每个片段onDestroy()被调用仍然没有回收内存。内存的后续增加最终导致OutOfMemoryError,表示Bitmap超出VM预算错误,VM无法分配n个字节的大小。

所有碎片将具有3种高质量的背景图像,这些图像存储在资源中。我在每个片段的onDestroy()中进行unbindDrawables。对于位图图像的使用,我将内存限制为堆内存的第5部分。 OOME来了,所有的门都关闭了,无法找到解决方案。

以下是我将用于Fragment Navigations的示例代码

FragmentManager fm = getFragmentManager();
            if(fm!=null)
            {
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.llfirst, fragments1);//if second tab ft.replace(R.id.llsecond,fragments2);
                ft.addToBackStack(null);
                ft.commit();
            }

最后,还有一个问题是,应用程序中使用的片段数量是否有任何限制。

1 个答案:

答案 0 :(得分:0)

我的猜测位图大小太大了。它没有得到正确的解除分配,gc无法回收内存。希望这会有所帮助。

XMl布局

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

@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();
    }
}