Glide缓存机制
Glide加载资源流程
-
Glide使用了ActiveResources(活动缓存弱引用)+MemoryCache(内存缓存Lru算法)+DiskCache(磁盘缓存Lru算法)。
-
ActiveResources:存储当前界面使用到的图片。界面不展示后,该Bitmap又被缓存至MemoryCache中,并从ActiveResources中删除。
-
Memory Cache:存储当前没有使用到的Bitmap,当MemoryCache中得到Bitmap后,该Bitmap又被缓存至ActiveResources中,并从MemoryCache中删除。
-
Disk Cache:持久缓存。例如图片加圆角,处理后图片会被缓存到文件中,应用被再次打开时可以加载缓存直接使用。
注意: ActiveResources + MemoryCache是内存缓存,都属于运行时缓存,且互斥(同一张图片不会同时缓存在ActiveResources+MemoryCache),应用被杀死后将不存在。
Glide 的缓存分层结构:
内存缓存在默认情况下,Glide自动开启内存缓存的,我们也可以通过调用skipMemoryCache(true) 方法,禁用内存缓存
RequestOptions options = new RequestOptions()
// 关闭内存缓存
.skipMemoryCache(true);
设置磁盘缓存模式:
diskCacheStrategy(DiskCacheStrategy.xxx) //是否开启磁盘缓存
可以设置4种模式:
DiskCacheStrategy.NONE:表示不缓存任何内容。
DiskCacheStrategy.SOURCE:表示只缓存原始图片。
DiskCacheStrategy.RESULT:表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL :表示既缓存原始图片,也缓存转换过后的图片。
Glide的缓存Key是什么
生成缓存Key的代码在Engine类的load()方法当中:
final String id = fetcher.getId();
EngineKey key = keyFactory.buildKey(id, signature, width, height,
loadProvider.getCacheDecoder(),loadProvider.getSourceDecoder(),
transformation, loadProvider.getEncoder(),transcoder,
loadProvider.getSourceEncoder());
在源码里查看可以知道,每一次的load方法内部,都会有一个fetcher.getId()方法获得了一个id字符串,这个字符串也就是我们要加载的图片的唯一标识,比如说如果是一张网络上的图片的话,那么这个id就是这张图片的url地址。然后,这个id会结合signature、width、height等等10个参数一起传入到EngineKeyFactory的buildKey()方法当中,从而构建出了一个EngineKey对象,这个EngineKey也就是Glide中的缓存Key了。 因此,如果你图片的width或者height发生改变,也会生成一个完全不同的缓存Key。
(这里补充一下:4.4以前是Bitmap复用必须长宽相等才可以复用,而4.4及以后是Size>=所需就可以复用,只不过需要调用reconfigure来调整尺寸)
参考:
https://blog.csdn.net/Love667767/article/details/127601652
https://blog.csdn.net/yinianzhijian99/article/details/123128564
https://juejin.cn/post/7006126659984162847
https://juejin.cn/post/6844903763342262280