进一步优化Bitmap Cache策略

时间:2021-05-30 09:45:26


上一篇文章中(http://blog.csdn.net/a345017062/article/details/8753649)提到了两种bitmap cache,这篇文章讲一下具体如何确定具体的Bitmap Cache策略。



一、为了更快的理解我们的策略,需要先说一下不同版本的Android系统中,对Bitmap的处理有何不同。
1、Android 2.2 (API level 8),以及更低的版本中,一旦GC开始运行,App的线程就会停止工作,因此会造成App性能的下降。从Android 2.3 (API level 9)开始,添加了concurrent GC,这意味着图片一旦没有引用,就可以很快地被回收。
2、在Android 2.3.3 (API level 10),以及更低的版本中,Bitmap的像素数据被存放在native memory中,而Bitmap对象在Dalvik heap中。所以,Bitmap像素数据的如何回收是未知的,可能会造成内存泄漏,从而导致crash。而到了Android 3.0 (API Level 11),以及更高的版本中,像素数据和Bitmap对象一样被存放在了Dalvik heap中。

接下来,说一下如何针对不同版本的Android系统优化Bitmap的内存管理。

在Android 2.3.3 (API level 10),以及更低的版本中,推荐使用Bitmap.recycle方法加快Bitmap内存的回收。
从Android 3.0 (API Level 11)开始,引入了BitmapFactory.Options.inBitmap,这果这个字段被设置了,则解码时会把重用这个字段所引用的那张Bitmap,避免重新分配内存。但使用这个字段时有一些需要注意的地方:
1、重用的Bitmap和即将被解码的Bitmap必须是相同的尺寸,且是JPEG或者PNG格式的。
2、 BitmapFactory.Options.inPreferredConfig字段设置无效,因为会被重用的Bitmap的configuration所覆盖。
3、一定要使用解码方法返回的Bitmap,因为重用可能会失败。
另外,在Android 3.0 (API Level 11),及以上的版本中,当Bitmap被从LruCache中挤出时,我们可以把这个Bitmap的soft reference存起来当作以后解码时的inBitmap来使用。


本文翻译自:http://developer.android.com/training/displaying-bitmaps/manage-memory.html