概述
Glide缓存机制大致分为三层:内存缓存、弱引用缓存、磁盘缓存。
存的顺序是:弱引用、内存、磁盘
取的顺序是:内存、弱引用、磁盘
以下展示的是取的过程
//从内存中取数据
EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);
if (cached != null) {
cb.onResourceReady(cached);
if (Log.isLoggable(TAG, Log.VERBOSE)) {
logWithTimeAndKey("Loaded resource from cache", startTime, key);
}
return null;
}
//从弱引用中取数据
EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);
if (active != null) {
cb.onResourceReady(active);
if (Log.isLoggable(TAG, Log.VERBOSE)) {
logWithTimeAndKey("Loaded resource from active resources", startTime, key);
}
return null;
}
//从磁盘中取
EngineJob engineJob = engineJobFactory.build(key, isMemoryCacheable);
DecodeJob<T, Z, R> decodeJob = new DecodeJob<T, Z, R>(key, width, height, fetcher, loadProvider, transformation,
transcoder, diskCacheProvider, diskCacheStrategy, priority);
EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);
jobs.put(key, engineJob);
engineJob.addCallback(cb);
engineJob.start(runnable);
看 loadFromCache 方法中显示,当 cached 有值的时候,将数据存进了activeResources中
private EngineResource<?> loadFromCache(Key key, boolean isMemoryCacheable) {
if (!isMemoryCacheable) {
return null;
}
EngineResource<?> cached = getEngineResourceFromCache(key);
if (cached != null) {
cached.acquire();
activeResources.put(key, new ResourceWeakReference(key, cached, getReferenceQueue()));
}
return cached;
}
接着看 getEngineResourceFromCache()方法中的第一行代码,内存中删除了要取出的值
private EngineResource<?> getEngineResourceFromCache(Key key) {
//Removes the value for the given key and returns it if present or null otherwise.
Resource<?> cached = cache.remove(key);
final EngineResource result;
if (cached == null) {
result = null;
} else if (cached instanceof EngineResource) {
// Save an object allocation if we've cached an EngineResource (the typical case).
result = (EngineResource) cached;
} else {
result = new EngineResource(cached, true /*isCacheable*/);
}
return result;
}
所以当发现内存中有值的时候,是先存进弱引用中,然后再查找弱引用显示图片,弱引用中没有图片的话再去硬盘中找。
Tip:采用弱引用的方式是为了防止内存泄漏
内存缓存
1.关键类
LruResourceCache 内部存储的相关方法类
MemoryCache 内部存储方法接口
Engine 统领内存相关操作的类
2.封装机制
内存缓存的封装机制很简单,找到这个类,你也就明白了
硬盘缓存
1.相关类
DiskLruCacheWrapper 磁盘存储相关方法类
DiskLruCacheFactory 获得以上实例的工厂类
ExternalCacheDiskCacheFactory 返回外部存储文件地址
InternalCacheDiskCacheFactory 返回内部存储文件地址
DecodeJob 对硬盘存储方法的进一步封装
2.封装机制
硬盘缓存相当于封装了两层,第一层是基础存储层,第二层相当于业务层,就是根据存储的需要进行存储
免费获取安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、Kotlin、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加:936332305 / 链接:点击链接加入【安卓开发架构】:https://jq.qq.com/?_wv=1027&k=515xp64
最后
以上就是沉默宝贝为你收集整理的Android Glide缓存策略分析的全部内容,希望文章能够帮你解决Android Glide缓存策略分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复