2012-08-14 35 views
5

我知道,在Android的API 10之前,因为实际的原始数据存储在本机内存中,所以重要的是要调用recycle(),因为Bitmap不再使用。API 11+上的调用bitmap.recycle()是做什么的?

然而,随着API 11,Bitmap s的存储在堆中,所以我的问题是:

它仍然需要呼吁Bitmap小号recycle()如果API是足够大(至少11)?如果我在这样的API上调用它,它会做什么?

+0

当你说“在API 10之前调用recycle()很重要”这是否意味着如果你不存储内存将永远不会被释放?官方文档说这是“推荐”,但如果它在本地内存中分配位图,我不明白如何在没有调用recycle()的情况下释放它。 – Tiago 2014-10-12 23:02:27

+0

@Tiago您可以观看此演讲:https://www.youtube.com/watch?v=_CruQY55HOk#t=656。位图在堆中占据了非常小的空间,但是它们的像素数据没有(仍然是堆的OOM机制的一部分),所以GC不知道情况有多好/多坏,如果不是这样, t在创建多个位图时触发,您可以轻松获得OOM。这就是为什么说“回收”很重要,以便它尽快清除位图(因为GC没有很好地完成工作)。 – 2014-10-13 06:43:25

+0

啊,我明白了。这解释了很多。非常奇怪的是,OutOfMemory异常会计算堆和本地内存,而GC只会查看堆。一旦从Honeycomb +位图的像素数据也在堆中,那么GC就可以完成它的工作。真是一团糟,嘿嘿!谢谢澄清! – Tiago 2014-10-13 20:03:00

回答

5

官方文档告诉我recycle()现在是一个高级调用,所以如果你想释放你的位图,你可以写一些像bitmap = null这样的东西,GC会处理所有其他事情。

+0

我懂了 。所以回收仍然会立即释放它的记忆? – 2012-10-18 23:00:57

+0

是的,回收将释放内存不看GC,所以你必须小心这个电话。 – s0nicYouth 2012-10-22 17:47:32

相关问题