Glide4.6.1原理解析
2018-07-13 14:55:39 2 举报
Android Glide图片加载框架原理解析
作者其他创作
大纲/内容
RequestManagerRetriever第140行Activity获取RequestManager方式是fragmentGet
ecodeJob的466行decodeFromFetcher方法通过decodeHelper获取解码模块,然后通过498行的path.load运行解码模块
RequestBuilder的618行requestManager.track正式开始请求
RequestBuilder的1020行obtainRequest方法,是通过SingleRequest的obtain来构建,SingleRequest是Glide中所有请求的唯一实现
GIF加载流程
GifFrameLoader的212行会去预加载下一帧
通过各模块返回了LoadData,然后通过loadData的loadData方法去加载图片数据
Glide的160行get方法当glide为null的时候会调用checkAndInitializeGlide(context);
RequestBuilder的847行buildRequest方法会传递给buildRequestRecursive来构建Request,增加了变换参数,优先级,视图宽高
Glide的708行with(Activity)
DecodeJob的448行decodeFromData方法decodeFromFetcher
RequestTracker的42行,调用了request.begin();也就是会调用唯一实现类SingleRequest的begin方法
DecodeJob的294行getNextGenerator方法,会根据阶段挑选生产者对象
资源解码准备好后会回调到onResourceReady,然后调用到setResourceInternal,然后调用到子类重写的setResource
是
都是为了获取RequestBuilder通过以下方式获取
Glide的776行with(View)
RequestManagerRetriever第110行获取Context对应的RequestManager
GlideBuilder的406行build方法450行会new Engine
构建参数并加载视图结束
gif加载流程结束
引擎加载图片资源
RequestManagerRetriever第127行FragmentActivity获取RequestManager方式及RequestManagerRetriever第138行FragmentActivity获取RequestManager方式都是supportFragmentGet
RequestManagerRetriever第349行去getRequestManagerFragment拿RequestManager,拿不到就新建,直接从系统FragmentManager里拿,拿不到就新建,ActivityFragmentLifecycle的生命周期
RequestBuilder的862行buildThumbnailRequestRecursive方法的最后面1008行通过obtainRequest来返回Request
返回资源,回调SingleRequest的onResourceReady,结束资源获取
Glide初始化流程
RequesManager的412行load(String)
DataCacheGenerator(数据缓存生产者)46行startNext
......等9个重载方法
RequesManager的424行load(Uri)
SourceGenerator(原始资源生产者)42行startNext
完成Glide的初始化
GlideContext的80行绑定Target
Glide的721行with(FragmentActivity)
是否UI线程
返回RequestManager结束
RequestManagerRetriever第84行获取全局唯一应用级别RequestManager即applicationManager属性
构建请求并加载到界面
DecodeHelper的144行获取解码模块,是通过Registry去获取,那么就会和加载一样到Glide里面去注册了
GifDrawable构造方法里构建了GifFrameLoader,然后再draw方法,会通过这个加载器获取下一帧图像
RequesManager的360行asGif,调用了as方法,传递的是GifDrawable的Class
RequestManger的632行track方法requestTracker.runRequest(request);运行请求(观察者模式)
都是继承自Fragment,都是无界面的,都是为了获取系统的管理生命周期,主要差别就是Support是处理SupportV4的兼容,而另外一个是系统直接兼容的。简单来说就是处理FragmentManager的引用问题
BitmapImageViewTarget的34行view.setImageBitmap
ImageViewTargetFactory类根据转换类型,new出对应的Target
资源填充到界面
Glide223行initializeGlide方法会通过反射获取注解生成的模块、Manifest里写的模块,然后226行写入设置信息,269行注册模块组件
RequesManager的388行load(Bitmap)
RequesManager类的load方法
SourceGenerator的第57行,通过DecodeHelper会从注册模块中获取并buildLoadData
从Glide.with()开始跟进
RequestManagerRetriever第97行通过RequestManagerFactory新建一个RequestManager返回出去,生命周期用应用的生命周期
Glide的662行getRetriever方法返回调用了Glide.get(context)
Glide的709行with方法返回调用了getRetriever(activity)
Glide的365行--417行添加了各种解码器(太多就不画了)
通过HttpUriLoader包装成HttpGlideUrlLoader然后返回输入流,下面去解析这个流
DecodeJob的398行decodeFromRetrievedData方法407行decodeFromData
Engine的182行,去内存缓存中获取
RequesManager的341行asBitmap,调用了as方法,传递的是Bitmap的Class
StandardGifDecode的164行会对GIF帧重复播放进行控制
RequesManager的400行load(Drawable)
SingleRequest的434行onSizeReady方法451行,交给引擎加载,然后返回加载状态,引擎加载完毕会通过回调到SingleRequest里的onResourceReady,然后加载资源到视图
构建请求参数,并加载进视图
ResourceCacheGenerator类92行,通过DecodeHelper会从注册模块中获取并buildLoadData
RequestManagerRetriever第384行去SupportRequestManagerFragment管理器拿RequestManager,拿不到就通过工厂新建。生命周期是当前ActivityFragmentLifecycle的生命周期
RequestBuilder的645行into方法,就开始把图片加载到视图里面去了。看646行,不是主线程就会抛异常了,然后读取view的Scale参数来修改掉默认的请求参数
DecodeJob的294行runGenerators方法300行stage = getNextStage(stage);会去挑选当前运行的阶段,获取生产者,并在299行currentGenerator.startNext()去执行这个生产者,301行去挑生产者
开始请求gif
Engine的173行,去活跃资源里获取,活跃资源通过弱引用抓着资源
从Glide.with跟进,有如下重载方法
RequesManager的546行as方法,返回的是根据传递的Class,new出来的RequestBuilder,new出来的RequestBuilder是读取了全局设置的默认构建请求信息的,我们拿到了这个默认的,就可以对每个请求的默认配置信息进行修改了
进入到RequestManagerRetriever复用RequestManager管理器里获取对应的RequestManager对象
开始播放是在ImageViewTarget里的OnStart里,然后就开始gif的播放了
模块是通过Registry的401行append方法注册进ModelLoaderRegistry模块注册器的
RequesManager的376行asDrawable,调用了as方法,传递的是Drawable的Class
获取RequestManager请求管理器
RequestBuilder的586行into方法滴597行buildRequest构建请求信息,传递了target,target监听,配置参数
加载数据完成后会调用到DecodeJob的363行onDataFetcherReady,注意里面修改了runReason = RunReason.DECODE_DATA;376行去解码
RequestBuilder的862行buildRequestRecursive方法979行获取构建图片请求(递归调用)
DrawableImageViewTarget的27行view.setImageDrawable
EngineJob的115行,发现是线程池去执行decodeJob,那么做的事情就在decodeJob的run方法里了
否
设置到对应的视图中,完成整个流程
Glide类的421行到482行注册了各种加载器,生成加载器是通过工厂模式(太多了,就不画了)
获取到了资源,开始填充到视图
Glide的696行with(Context)
都是继承自ImageViewTarget、ViewTarget、BaseTarget实现了生命周期回调
Glide的733行with(Fragment)
我们已经了解了构建请求,下面我们回到RequestBuilder的599行和上次这个视图的请求比较一下,如果是以前的请求,则释放掉当前的,继续以前的请求。不是的话,则保存新的请求
ResourceCacheGenerator(资源缓存生产者)41行startNext
会到StreamGifDecoder,看decode方法,会被包装成byteBufferGifDecoder
DataCacheGenerator的第69行,通过DecodeHelper会从注册模块中获取并buildLoadData
经过StringLoader,包装成HttpUriLoader
Glide的Engine是如何工作的
DecodeHelper的184行getModelLoaders方法通过glideContext.getRegistry()去获取模块列表
Engine的268行去内存缓存中获取资源,内存缓存cache是我们一开始GlideBuider时传递的缓存
SingleRequest的226行begin方法262行当大小准备好后,会运行onSizeReady方法
GifFrameLoader的225行加载下一帧的时候会构建一个DelayTarget通过GifFrameResourceDecoder的解码,获取下一帧的内容
DecodeJob类的217行run方法230行把run包装了出去
DecodeJob类的217行runWrapped方法开始请求资源工作流,会根据当前的运行阶段,判断试运行本地加载资源、服务端获取资源还是解码资源
开始加载资源,调用到Engine的148行load方法170行通过主键工厂获取引擎资源唯一key
获取RequestManager流程
收藏
0 条评论
回复 删除
下一页