参考资料:Glide框架及源码解析
绑定生命周期
Glide会为每一个RequestManager绑定一个特殊的Fragment,并且添加生命周期回调,这样RequestManager就可以根据Fragment生命周期的改变,开始或者暂停释放Request
数据缓存
Glide使用内存缓存和磁盘缓存
内存缓存LruChahe,ActiveResources(保存正在使用的资源)
磁盘缓存使用LRU算法
重要的类
RequestManagerRetriever:单例,主要用于创建RequestManager,RequestManagerFragment
RequestManager:主要用于管理Request,一个RequestManagerFragment对应一个RequestManager,RequestManager会将自己注册到相应Fragment的ActivityFragmentLifecycle中,这样Fragment的生命周期变化,会通知RequestManager,RequestManager持有一个RequestTracker,和一个TargetTracker
RequestTracker:保存了这个RequestManager中的所有Request,有助于RequestManager开始或者暂停Request
TargetTracker:保存了这个RequestManager中的所有Target
ActiveResources:保存了所有正在使用中的资源,加载资源时,首先会从ActiveResources中获取,如果获取不到则从LruCache中加载,如果加载到了,则将资源从LruCache中一处,添加到ActiveResources中
Request:每一个图片加载的请求都会封装成一个Request对象,并且加入RquestManager中,然后去调用begin方法,去执行Request,Request在创建的时候会和相应的Target绑定,因此在创建一个Request对象时候,首先判断这个Target是否已经有了一个Request,如果已经有了,则将之前的Request清除掉,因此ListView在复用View的时候,就不会发送无用的请求
Engine:数据加载引擎,首先从ActiveResources中加载,加载不到从LruCache中加载,还加载不到,创建EngineJob和DecodeJob对象
EngineJob:创建EngineJob时会先判断是否已经有了相同key值(即相同请求)的EngineJob,如果存在只需要添加一个新的CallBack,如果不存在创建新的EngineJob对象
DecodeJob:DecodeJob是一个Runnable对象,正在加入线程池中加载数据的类,DecodeJob首先会从磁盘加载,如果加载不到则从网络加载,加载数据时会创建相应的DataFetcherGenerator对象,真正的去加载对象