Glide源码学习-三大缓存

Glide源码学习-三大缓存



Lru算法

Lru算法基于linkedHashmap,有一个最大长度值,如果添加元素的已经元素已经满了,就会把最不常使用的元素移除,里面的元素只要使用过,就会放到最近的位置,方便调用,
Gilde框架中,内存缓存和磁盘缓存都是使用的Lru算法

LinkedHashMap<String,Integer> map = new LinkedHashMap<>(0,0.75f,true);
map.put("one",1);
map.put("two",2);
map.put("three",3);
map.put("four",4);
map.put("five",5);


for (Map.Entry<String,Integer> entry :map.entrySet()){
    System.out.println(entry.getValue());       // 1 2 3 4 5
}
map.get("three");
for (Map.Entry<String,Integer> entry :map.entrySet()){
    System.out.println(entry.getValue());       // 1 2  4 5 3
}

一、Glide执行流程

1.给每一个RequestManager绑定一个空白的Fragment来管理生命周期

2.Request对象的构建(请求的宽 高 采样等各种配置)

3.请求之前,先检测缓存—Engine缓存机制的检测:先检测活动缓存ActiveResources有没有,在检测内存缓存LruResourceCache有没有,如果有,就会直接回调,去加载

4.如果上面两个缓存都没有找到,就会在EngineJob构建一个新的异步任务,执行Request之前,会先检测DiskCache中有没有本地磁盘缓存

5.如果没有磁盘缓存,就通过网络请求,返回输入流InputStream,解析输入流进行采样压缩,最终拿到bitmap

6.把bitmap转换成Drawable,然后构建磁盘缓存,构建内存缓存ActiveResources

7.最后回到ImageViewTarget ,调取它的子类DrawableImageViewTarget显示图片。

二、三大缓存

在这里插入图片描述

1.活动缓存

1.图片资源在活动缓存和内存缓存中只会存在一个,不会共存
2.存在的目的就是为了及时释放内存,减少内存开销,
3.创建Hashmap时,添加了一个弱引用,并且监听,如果活动缓存被移除了,就加入到内存缓存中

2.内存缓存

1.使用 Lru算法,继承自 LruCache<String, Value>, 重写sizeOf(),entryRemoved()方法监听元素被移除
2.如果频繁加载图片,例如瀑布流,列表之类的,会使用BitmapPool复用池(LruBitmapPool 这个类),作用是复用Bitmap地址,避免频繁调用内存空间,防止内存抖动、内存碎片

3.磁盘缓存

1.磁盘缓存是从网络上请求图片的时候构建的。
2.使用JakeWharton开源项目DiskLruCache进行数据的保存和读取 https://github.com/JakeWharton/DiskLruCache
3.效率高的原因是DiskLruCache这个库针对图片保存做了优化,进行了加密和压缩处理


图片加载流程(三级缓存):

1.去加载一个url地址,优先会去从活动缓存中加载。
2.如果活动缓存中没有,则会去内存缓存中查找。
3.内存缓存也没有,则会去从磁盘缓存读取

1)如果磁盘缓存有这个图片,就去读取到活动缓存中,并加载
2)如果磁盘缓存中没有这个图片,则会去请求网络下载图片到本地,并读取一份到活动缓存,并加载出来

4.如果当前页面关闭,活动缓存资源就会保存一份到内存缓存中,活动缓存数据销毁
5.跳到别的页面,如果有相同资源的文件,就会从内存缓存中加载这个资源文件,并且读取到活动缓存中,内存缓存移除这个资源文件

与传统的三级缓存相比,其实Glide相当于是四级缓存,区别就是传统三级缓存只有内存缓存,而Glide是把内存分成了活动缓存和内存缓存两种。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值