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
}
1.给每一个RequestManager绑定一个空白的Fragment来管理生命周期
2.Request对象的构建(请求的宽 高 采样等各种配置)
3.请求之前,先检测缓存—Engine缓存机制的检测:先检测活动缓存ActiveResources有没有,在检测内存缓存LruResourceCache有没有,如果有,就会直接回调,去加载
4.如果上面两个缓存都没有找到,就会在EngineJob构建一个新的异步任务,执行Request之前,会先检测DiskCache中有没有本地磁盘缓存
5.如果没有磁盘缓存,就通过网络请求,返回输入流InputStream,解析输入流进行采样压缩,最终拿到bitmap
6.把bitmap转换成Drawable,然后构建磁盘缓存,构建内存缓存ActiveResources
7.最后回到ImageViewTarget ,调取它的子类DrawableImageViewTarget显示图片。
1.图片资源在活动缓存和内存缓存中只会存在一个,不会共存
2.存在的目的就是为了及时释放内存,减少内存开销,
3.创建Hashmap时,添加了一个弱引用,并且监听,如果活动缓存被移除了,就加入到内存缓存中
1.使用 Lru算法,继承自 LruCache
2.如果频繁加载图片,例如瀑布流,列表之类的,会使用BitmapPool复用池(LruBitmapPool 这个类),作用是复用Bitmap地址,避免频繁调用内存空间,防止内存抖动、内存碎片
1.磁盘缓存是从网络上请求图片的时候构建的。
2.使用JakeWharton开源项目DiskLruCache进行数据的保存和读取 https://github.com/JakeWharton/DiskLruCache
3.效率高的原因是DiskLruCache这个库针对图片保存做了优化,进行了加密和压缩处理
1.去加载一个url地址,优先会去从活动缓存中加载。
2.如果活动缓存中没有,则会去内存缓存中查找。
3.内存缓存也没有,则会去从磁盘缓存读取
1)如果磁盘缓存有这个图片,就去读取到活动缓存中,并加载
2)如果磁盘缓存中没有这个图片,则会去请求网络下载图片到本地,并读取一份到活动缓存,并加载出来
4.如果当前页面关闭,活动缓存资源就会保存一份到内存缓存中,活动缓存数据销毁
5.跳到别的页面,如果有相同资源的文件,就会从内存缓存中加载这个资源文件,并且读取到活动缓存中,内存缓存移除这个资源文件
与传统的三级缓存相比,其实Glide相当于是四级缓存,区别就是传统三级缓存只有内存缓存,而Glide是把内存分成了活动缓存和内存缓存两种。