Android学习笔记——bitmap缓存与内存复用

本文章为学习笔记  qq879689064

Bitmap是导致程序oom的一个重要的原因首先bitmap是如何进行计算的呢? 

Bitmap内存大小计算

ARGB_8888 各占8个位,1个字节8位 即长乘宽乘4

RGB_565 占16位即长乘宽乘2

那么该如何更好的优化呢?

图片的压缩处理

inJustDecodeBounds:读取out..的参数 计算内存大小

inPreferedConfig 设置图片解码后的格式

inSampleSize 设置图片缩放比例  减少内存大小

Android学习笔记——bitmap缓存与内存复用_第1张图片
图1

缓存机制:

Lrucache是andorid提供的一个缓存工具类,使用lru缓存淘汰算法


根据数据的历史访问记录来进行淘汰数据,如果数据最近被访问,那么将来被访问的几率也更高

Android学习笔记——bitmap缓存与内存复用_第2张图片
图2

1. 新数据插入到链表头部;

2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;(双向链表结构)

3. 当链表满的时候,将链表尾部的数据丢弃。


首先 重写一个类 继承lrucache  处理sizeof和entryRemoved方法

Android学习笔记——bitmap缓存与内存复用_第3张图片
图3

接着创建ImageCache管理memorycache


1.创建ImageCache类  设置缓存大小,建议当前应用可用最大内存的八分之一  如图四


Android学习笔记——bitmap缓存与内存复用_第4张图片
图4

2.加入 放入bitmap 获取bitmap 清除缓存的方法

Android学习笔记——bitmap缓存与内存复用_第5张图片
图5

Bitmap内存复用

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


Android学习笔记——bitmap缓存与内存复用_第6张图片
图6

在之前写好的MemoryCache上新增复用池  保存被复用的bitmap

Android学习笔记——bitmap缓存与内存复用_第7张图片
图7


Android学习笔记——bitmap缓存与内存复用_第8张图片
图8

这里getAllocationByteCount() 是指被复用的内存大小

在android3.0到8.0之前bitmap在内存中的java

在8.0以后bitmap在内存中的native中 所以我们要手动释放bitmap

这里复用池采用的是弱引用 被gc扫过一次后放入引用队列用  引用队列开启线程进行处理bitmap  将bitmap释放


Android学习笔记——bitmap缓存与内存复用_第9张图片
图9

注意:

api19以前格式只为jpg,png,同等宽高,inSampleSize为1才能复用

api19以前被复用的bitmap的inpreferredConfig;会覆盖待分配内存的Bitmap设置inpreferredconfig

api19以后复用复用的bitmap的内存 必须大于等于需要申请的bitmap的内存

获取复用池中的bitmap 如图10 11


Android学习笔记——bitmap缓存与内存复用_第10张图片
图10


Android学习笔记——bitmap缓存与内存复用_第11张图片
图11

你可能感兴趣的:(Android学习笔记——bitmap缓存与内存复用)