Glide的into方法
2018-08-08 14:05:24 3 举报
Glide加载图片和缓存过程
作者其他创作
大纲/内容
在begin方法中会判断是否数据源是否为空,如果为空显示错误图片或占位图,如果不为空判断长宽数值是否正确,如果正确就会调用OnSizeReady方法,如果不正确也会经过计算测量获取长宽再调用onSizeReady方法
判断是否处于暂停状态,即生命周期进入onPause
如果调用asBitmap方法就会传入的是Bitmap类型,就会返回BitmapImageViewTarget
DecodeJob418行调用notifyComplete方法回调EngineJob的onResourceReady方法DecodeJob429行调用onEncodeComplete方法释放资源
buildRequest方法又调用了buildRequestRecursive方法
调用sourceCacheGenerator的startNext方法,即直接执行DataCacheGenerator的startNext方法
复用旧请求对象,调用SingleRequest的begin方法开始请求并返回traget对象
如果资源能正常解析DecodeJob400行调用notifyEncodeAndRelease方法
handleResultOnMainThread中构建engineResource对象将图片引用值+1调用Engine的onEngineJobComplete方法将资源添加到正在使用资源缓存中从任务队列中移除该EngineJob
into方法的执行流程
回调SourceGenerator的onDataReady方法
DecodeJob363行调用decodeFromRetrievedData方法
DecodeJob:实现了Runnable接口,调度任务的核心类,整个请求的繁重工作都在这里完成:处理来自缓存或者原始的资源,应用转换动画以及transcode
先找缓存,再找资源是不是处于活动状态在前台显示,如果都不是,走请求,创建了两个对象类型分别是EngineJob和DecodeJob
RequestManager移除traget对象然后traget对象重新和Request对象绑定并调用RequestManger的track方法
跳过硬盘缓存,调用DecodeJob的onDataFetcherReady方法
获取Traget对象之前绑定过的SingleRequest对象,并判断旧请求和新请求对象是否一样
调用RequestBuilder的into方法,传入显示图片的ImageView参数
是
runWrapper过程中,如果加载一张新图片会把DataCacheGenerator、ResourceCacheGenerator、SourceGenerator的stratNext方法走了一遍
否
在OnSizeReady方法中调用Engine中的load方法继续跟进看看
loadData方法接着调用loadDataWithRedirects方法
在DecodeJob中的run方法中执行了runWrapper
如果调用的是asFile等,就会抛出异常,因为File等类型无法加载到imageView中
onResourceReleased方法判断是否跳过内存缓存,如果跳过就直接销毁否则加入实现了LRU算法的缓存中
如果调用的是asDrawble或asGif传入的是Drawble的子类,就会返回BitmapImageViewTarget
添加到等待队列,等待暂停状态结束开始请求
Glide图片加载完成
在SourceGenetator中的stratNext中会调用HttpUrlFetcher中的loadData方法
track方法中把绑定完新请求对象的traget重新添加到RequestManager中,调用runRequest方法
生成Key值,将请求获取的流对象最终解析成File添加到实现了LRU缓存算法的硬盘缓存中sourceCacheGenerator被DataCacheGenerator对象赋值
根据硬盘缓存策略,判断是否需要缓存到硬盘中
先根绝key获取到缓存的文件,构建ModelLoader对象,调用FileFetcher的loadData方法,将File转换成Data调用DataCacheGenerator的onDataReady方法
DecodeJob394行通过调用decodeFromData方法将Data解析成Resource对象
把请求得到的data赋值给dataToCache调用DecodeJob的reschedule方法,然后回到了runWrapped方法,继续调用runGenerators方法又进入了SourceGenerator的stratNext方法
先判断是从缓存加载拖还是从数据源加载图片,来选择线程池,调用execute()方法
判断是否同步加载,如果是同步加载就直接执行,如果异步加载通过线程池执行DecodeJob中的run方法
然后调用engineJob.start(decodeJob)
由于dataToCache不为空直接调用cacheData方法
EngineJob:负责调度线程池执行DecodeJob,当请求结束时会重新切回到主线程
调用请求对象的begin方法开始请求,请求对象为SingleRequest类型
在handleMessage中处理消息调用EngineJob288行handleResultOnMainThread方法
在loadDataWithRedirects方法中通过网络请求获取并返回InputStream流对象
在EngineJon的onResourceReady方法中将传递来的Resurce保存用主线程handler发送消息,切回主线程加载资源
调用DecodeJob的onDataFetcherReady方法
调用engineResource的release方法将图片引用值-1如果引用值为0,调用Engine的onResourceReleased方法
buildRequestRecursive方法主要处理缩略图,并调用obtainRequest方法构建了SingleRequest请求对象
根据添加Traget的回调函数数量,即多少前台View正在使用该图片将图片引用值+1,并调用Traget的回调函数onResourceReady加载资源到View中
0 条评论
下一页