「Glide」源码解析系列
承前启后
SingleRequestrequest开始请求,实际的工作又交给了Engine对象
此节涉及到的类有
Engine
EngineKey
EngineResource
Engine的起源
先来看看engine对象是哪里来的!
SingleRequest SingleRequest RequestBuilderEngine对象从GlideContext对象中获取的,如果没记错GlideContext对象应该是个单例
RequestBuilder Glide GlideGlide对象无疑是个单例对象,glideContext又是Glide单例对象中的final对象
Glide GlideContext GlideContextGlideContext的engine是外部传入的
到此可以知道:engine来自glideContext,glideContext来自glide单例,glide单例对象又是通过构造者模式GlideBuilder生成的
GlideBuilder.build绕了好大一圈,engine = new Engine 参数从GlideBuilder中传入
load
知道了engine对象的来源和参数值,开始engine的load工作
load中的工作大致可分为以下几种:
- 生成唯一标识EngineKey
- 由EngineKey从ActiveResources中找EngineResource,找到即加载成功
- 由EngineKey从Cache中找EngineResource,找到即加载成功
- 找不到就启用Job加载
EngineKey
EngineKey由EngineKeyFactory对象keyFactory生成
EngineEngineKey由:原始资源、签名、宽、高、图片转换、原始资源类型、将要转换的类型、加载相关参数,这几个参数生成
EngineKeyEngineKey重写了equals和hashCode方法,用来唯一标识key
ActiveResources
有了资源唯一标识key,先在引用缓存中查找是否能够命中
Engine如果请求资源不允许内存缓存,则没有必要去缓存中查找
变量activeResources为final
Engine Engine Engine传入的参数为null,activeResources = new ActiveResources
ActiveResourcesactiveResources的get方法其内部又调用了activeEngineResources的get
ActiveResourcesactiveEngineResources是Map类型,key为EngineKey,value为ResourceWeakReference
ActiveResourcesResourceWeakReference继承自WeakReference,这里带一下弱引用
WeakReference
弱引用对象,每次GC都会被回收
WeakReferenceWeakReference共两个构造方法,泛型T为引用的类型
- 单参数构造方法:参数即引用对象
- 双参数构造方法:除单参数构造方法功能外,ReferenceQueue用来接收被GC的对象,存在队列中,因此常用来监听对象回收(只要队列中有对象,即被回收)
回到ActiveResources的get方法,从activeEngineResources的Map中获取一弱引用对象
ActiveResources若引用对象为null,表明引用缓存未命中
若命中,则取出引用中的EngineResource
既然资源被使用即强引用,则清除弱引用activeRef
Engine在引用缓存这一层获取到EngineResource后还要给EngineResource增加引用计数acquire
EngineCache
引用缓存未命中,则来到了内存缓存
Engine同样的思路,变的只是存储位置
引用缓存中,EngineResource被转成弱引用存在Map中
内存缓存中,Resource则存在cache中,其类型为MemoryCache
Engine Engine这个cache来自GlideBuilder
Engine Engine GlideBuilder类型是LruResourceCache
LruResourceCache内容就不多讲了,内部实现是LinkedHashMap,策略为最近最少使用的对象被移除
LruCacheJob
引用缓存、内存缓存都没有命中,便启动了Job
Engine将Job作为参数,创建了LoadStatus返回了出去
总结
Engine加载的Resource,仅仅是存在在引用缓存和内存缓存中的
其余缓存策略和实际的加载还在后续的Job中
网友评论