本文章为学习笔记 qq879689064
Bitmap是导致程序oom的一个重要的原因首先bitmap是如何进行计算的呢?
Bitmap内存大小计算
ARGB_8888 各占8个位,1个字节8位 即长乘宽乘4
RGB_565 占16位即长乘宽乘2
那么该如何更好的优化呢?
图片的压缩处理
inJustDecodeBounds:读取out..的参数 计算内存大小
inPreferedConfig 设置图片解码后的格式
inSampleSize 设置图片缩放比例 减少内存大小
缓存机制:
Lrucache是andorid提供的一个缓存工具类,使用lru缓存淘汰算法
根据数据的历史访问记录来进行淘汰数据,如果数据最近被访问,那么将来被访问的几率也更高
1. 新数据插入到链表头部;
2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;(双向链表结构)
3. 当链表满的时候,将链表尾部的数据丢弃。
首先 重写一个类 继承lrucache 处理sizeof和entryRemoved方法
接着创建ImageCache管理memorycache
1.创建ImageCache类 设置缓存大小,建议当前应用可用最大内存的八分之一 如图四
2.加入 放入bitmap 获取bitmap 清除缓存的方法
Bitmap内存复用
bitmap复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。
在之前写好的MemoryCache上新增复用池 保存被复用的bitmap
这里getAllocationByteCount() 是指被复用的内存大小
在android3.0到8.0之前bitmap在内存中的java
在8.0以后bitmap在内存中的native中 所以我们要手动释放bitmap
这里复用池采用的是弱引用 被gc扫过一次后放入引用队列用 引用队列开启线程进行处理bitmap 将bitmap释放
注意:
api19以前格式只为jpg,png,同等宽高,inSampleSize为1才能复用
api19以前被复用的bitmap的inpreferredConfig;会覆盖待分配内存的Bitmap设置inpreferredconfig
api19以后复用复用的bitmap的内存 必须大于等于需要申请的bitmap的内存
获取复用池中的bitmap 如图10 11