2011-12-15 49 views
0

我有一个菜单应用程序,其中菜单项是ViewAnimator的视图的屏幕截图。一切工作正常。我做screeshots这个简单的sniplet,使用绘图缓存写在许多例子:无法在Android 3.0中释放内置图形缓存的内存

// Drawing cache is off, so build it manually and create scaled bitmap 
    layout.buildDrawingCache(); 
    Bitmap bm = layout.getDrawingCache(); 
    Bitmap bm_small = Bitmap.createScaledBitmap(bm, item_width, item_height, true); 

在同一个函数我尝试释放用于创建截图所有内存:

layout.destroyDrawingCache(); 
    bm.recycle(); 
    bm = null; 

但可惜的是在垃圾收集器不释放此位图内存。我也用HPROF内存分析来找到一些对Bitmap的引用,它不能被释放,但是我没有成功。重要的信息是,我正在为Honeycomb Android 3.0开发,所以截图非常大 - 每个截图都需要大约3MB的内存,并且不会释放它。

我不明白,为什么回收在这个例子中不起作用。我怀疑,在我的设置中有一些非常特殊的问题:Android 3.0蜂窝+硬件加速启用+大堆启用+使用图形缓存。我发现的提示都没有帮助。

请你能解释一下,为什么recycle在这种情况下不起作用?任何帮助将非常感激。

回答

0

是的,我有这个问题。这是非常糟糕的行为,因为位图不会自行释放。最好的建议是使用较小的位图图块

和其他建议是使用SoftReference<Bitmap>来存储您的数据对象。 SoftReferenced对象在需要内存时会自行删除。尽管如此,你可以收拾丢失的东西。

虽然位图方法,只是有缺陷。

+0

感谢您的回答。据我所知,我不能使用更小的位图,因为我必须从整个布局制作截图。而SoftReference解决方案在我看来也不适用,因为我不存储任何对Bitmap的引用:/ – 2011-12-16 00:07:42