上一篇文章介绍了Glide的源码解析 的主线流程,这里说下
Glide
的缓存机制。
缓存机制加载流程
Glide
的缓存层级包括:
活动缓存:存放所有正在访问的图片。
内存缓存(LRU)、磁盘缓存(LRU)、模型model
(网络,io
)。
Glide
的整体缓存流程如下:
- 页面加载图片时,先去活动缓存获取。如果有直接加载;
- 如果活动缓存没有,则从内存缓存获取。如果有,则把内存缓存中的图片拿到活动缓存,然后再去加载;
- 如果内存缓存没有,则去磁盘缓存中获取。如果有,则把磁盘缓存中的图片复制一份到活动缓存中,然后再去加载;
- 如果磁盘缓存中没有,则去
model
中获取。获取到则在磁盘缓存和活动缓存中保存下来,然后再显示; - 如果页面销毁,则将活动缓存中的资源移动到内存缓存中;
- 如果进程杀掉,活动缓存和内存缓存属于运行时缓存,再次启动会从磁盘缓存中获取,并复制到活动缓存然后显示;
LRU 机制
遵循原则:最近最少使用
这里简单的提一下,不做深究。
LruCache
是使用LinkedHashMap
来管理缓存的。
public LruCache(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}
this.maxSize = maxSize;
// true 访问优先
this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
}
- put
当LruCache
调用put
的时候,都会判断是否大于maxSize
,如果大于就移除最近最少使用的元素。
如果集合中已经有相同的元素,则将旧的移除掉。
总结
Glide
的缓存机制采用了活动缓存、内存缓存、磁盘缓存。活动缓存的设计解决了当maxSize
比较小而页面图片多不停put
时,直接使用内存缓存LRU
机制可能出现的使用中而被移除的问题。
等有时间再补一张流程图。