android性能优化之Bitmap优化
计算Bitmap大小
影响Bitmap大小因素
1.图片长度
2.图片宽度
3.图片的缩放比
4.每个像素所占的字节(Bitmap的RGB值)
BitMap内存的计算公式为:
一张图片(BitMap)占用的内存=图片长度 * 图片宽度单位 * 像素占用的字节数
优化-内存回收
在Android2.3.3之前推荐使用Bitmap.recycle()方法进行Bitmap的内存回收。
例:
if(bitmap != null && !bitmap.isRecycled()){ // 回收并且置为nullbitmap.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的内存被复用,避免了内存的回收及申请过程,显然性能表现更佳。不过,使用这个字段有几点限制:【android性能优化之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第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 数据库设计与优化
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)