android性能优化之Bitmap优化

计算Bitmap大小

影响Bitmap大小因素
1.图片长度
2.图片宽度
3.图片的缩放比
4.每个像素所占的字节(Bitmap的RGB值)
BitMap内存的计算公式为:
一张图片(BitMap)占用的内存=图片长度 * 图片宽度单位 * 像素占用的字节数

优化-内存回收

在Android2.3.3之前推荐使用Bitmap.recycle()方法进行Bitmap的内存回收。
例:

if(bitmap != null && !bitmap.isRecycled()){ 

        // 回收并且置为null

        bitmap.recycle(); 

        bitmap = null; 

} 
备注:只有当确定这个Bitmap不被引用的时候才能调用此方法,否则会有“Canvas: trying to use a recycled bitmap”这个错误。

Tip:Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap对象,只能通过BitmapFactory类的各种静态方法来实例化一个Bitmap。仔细查看BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分是Java部分的,一部分是C部分的。这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用recycle()方法来释放C部分的内存。从Bitmap类的源代码也可以看到,recycle()方法里也的确是调用了JNI方法了的。

优化-Bitmap缓存

使用LruCache和DiskLruCache做内存和磁盘缓存;

优化-Bitmap复用

主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。
复用的条件

Android3.0(API 11之后)引入了BitmapFactory.Options.inBitmap字段,设置此字段之后解码方法会尝试复用一张存在的Bitmap。这意味着Bitmap的内存被复用,避免了内存的回收及申请过程,显然性能表现更佳。不过,使用这个字段有几点限制:
声明可被复用的Bitmap必须设置inMutable为true;

  • Android4.4(API 19)之前只有格式为jpg、png,同等宽高(要求苛刻),inSampleSize为1的Bitmap才可以复用;
  • Android4.4(API 19)之前被复用的Bitmap的inPreferredConfig会覆盖待分配内存的Bitmap设置的inPreferredConfig;
  • Android4.4(API 19)之后被复用的Bitmap的内存必须大于需要申请内存的Bitmap的内存;
  • Android4.4(API 19)之前待加载Bitmap的Options.inSampleSize必须明确指定为1。

复用模块参考
Managing Bitmap Memory--Use an existing bitmap

你可能感兴趣的:(android性能优化之Bitmap优化)