美文网首页
「Glide」中的Engine

「Glide」中的Engine

作者: s1991721 | 来源:发表于2019-03-02 00:04 被阅读0次

    「Glide」源码解析系列

    承前启后

    SingleRequest

    request开始请求,实际的工作又交给了Engine对象

    此节涉及到的类有
    Engine
    EngineKey
    EngineResource

    Engine的起源

    先来看看engine对象是哪里来的!

    SingleRequest SingleRequest RequestBuilder

    Engine对象从GlideContext对象中获取的,如果没记错GlideContext对象应该是个单例

    RequestBuilder Glide Glide

    Glide对象无疑是个单例对象,glideContext又是Glide单例对象中的final对象

    Glide GlideContext GlideContext

    GlideContext的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加载
    Engine

    EngineKey

    EngineKey由EngineKeyFactory对象keyFactory生成

    Engine

    EngineKey由:原始资源、签名、宽、高、图片转换、原始资源类型、将要转换的类型、加载相关参数,这几个参数生成

    EngineKey

    EngineKey重写了equals和hashCode方法,用来唯一标识key

    ActiveResources

    有了资源唯一标识key,先在引用缓存中查找是否能够命中

    Engine

    如果请求资源不允许内存缓存,则没有必要去缓存中查找

    变量activeResources为final

    Engine Engine Engine

    传入的参数为null,activeResources = new ActiveResources

    ActiveResources

    activeResources的get方法其内部又调用了activeEngineResources的get

    ActiveResources

    activeEngineResources是Map类型,key为EngineKey,value为ResourceWeakReference

    ActiveResources

    ResourceWeakReference继承自WeakReference,这里带一下弱引用

    WeakReference

    弱引用对象,每次GC都会被回收

    WeakReference

    WeakReference共两个构造方法,泛型T为引用的类型

    • 单参数构造方法:参数即引用对象
    • 双参数构造方法:除单参数构造方法功能外,ReferenceQueue用来接收被GC的对象,存在队列中,因此常用来监听对象回收(只要队列中有对象,即被回收)

    回到ActiveResources的get方法,从activeEngineResources的Map中获取一弱引用对象

    ActiveResources

    若引用对象为null,表明引用缓存未命中

    若命中,则取出引用中的EngineResource

    既然资源被使用即强引用,则清除弱引用activeRef

    Engine在引用缓存这一层获取到EngineResource后还要给EngineResource增加引用计数acquire

    Engine

    Cache

    引用缓存未命中,则来到了内存缓存

    Engine

    同样的思路,变的只是存储位置

    引用缓存中,EngineResource被转成弱引用存在Map中

    内存缓存中,Resource则存在cache中,其类型为MemoryCache

    Engine Engine

    这个cache来自GlideBuilder

    Engine Engine GlideBuilder

    类型是LruResourceCache

    LruResourceCache

    内容就不多讲了,内部实现是LinkedHashMap,策略为最近最少使用的对象被移除

    LruCache

    Job

    引用缓存、内存缓存都没有命中,便启动了Job

    Engine

    将Job作为参数,创建了LoadStatus返回了出去

    总结

    Engine加载的Resource,仅仅是存在在引用缓存内存缓存中的

    其余缓存策略和实际的加载还在后续的Job中

    相关文章

      网友评论

          本文标题:「Glide」中的Engine

          本文链接:https://www.haomeiwen.com/subject/seoluqtx.html