美文网首页
Glide图片加载基本流程

Glide图片加载基本流程

作者: dotdotdotdotbar | 来源:发表于2019-04-07 11:40 被阅读0次

这两天稍微研究了一下Glide的源码,在这里做一个分享,但是因为Glide源码实在是太错综复杂了,如果直接上来就贴代码肯定让人晕头转向,况且很多细节的地方我本身也没有搞太清楚,所以这里只是大致的介绍一下它的流程吧,希望能够指明一下阅读的方向吧,不至于陷入太多的细节之中无法自拔。因为这两年工作上都没怎么用安卓,所以我还是那之前刚毕业时写的一个app来看的源码,当时用的是glide 3.7.0,可能有些地方不太一样,但是整体的流程应该不会变太多。
首先,肯定要介绍一下Glide的最基本使用啦

Glide.with(this).load(url).into(imageView);

这是Glide最简单的使用方法,所以分析也围绕着这几个方法进行。

with()

首先是with的实现,它接收一个Context类型的实例,并且有多个重载方法,Context、Activity、FragmentActivity和Fragment等。如果传进来的是Fragment或Activity等,它会通过添加一个空白的fragment让Glide与当前的activity生命周期绑定起来,从而做到根据activity的生命周期来控制图片加载等功能。但是如果传入的的Application的Context的话,就只能做到和应用程序的生命周期同步了,同时,如果说不在主线程中调用Glide的话,也会默认与Application相关联,从而不能够做到根据activity的生命周期控制图片加载了。因此在调用with的时候,尽量不要传入application的Context或者在后台线程中调用。

load()

接下去就是load方法了,它主要其实就是构建一个RequestBuilder对象的实例,其中包含了into方法中需要用到的很多Loader、Provider对象等等,包括加载图片的fetcher、一些解码及转码图片用到的工具类都在这里面构造完成,除此之外,还有Glide单例的构建,即是Glide的初始化也在这里完成。这个方法中构建各种loader等工具对象的方法实在是有点复杂,刚开始看还是可以不用理的很清楚吧,后面需要用到的时候再回过头来找找会比较好。

into()

最后,也就是重点的into方法了,它主要流程就是:构建请求、加载图片、解码并缓存图片、包装、最终显示图片。

构建请求

构建请求的时候,会把用户设置的占位图、图片类型等各种的设置都带上,用这些参数生成request对象,后面的加载、解码等流程都会用到这些参数。

加载图片

加载图片分为加载已缓存在内存中的图片、加载网络图片以及加载本地硬盘缓存的图片三种。其顺序是,先从内存中加载、内存中没有的话就从本地硬盘缓存加载,再没有的话再去加载网络图片。
在介绍缓存之前,需要先介绍一下Glide缓存key生成所依赖的属性,这里就直接贴一下代码吧。

final String id = fetcher.getId();
EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
transcoder, loadProvider.getSourceEncoder());

可以看出来,key构建依赖了id、图片宽高、签名等等一系列属性,其中id就是图片的url。
在内存缓存中,如果已经缓存了图片,优先从内存中加载,因为内存中的图片已经是解码过的了,所以不需要后续的流程,加载图片到此结束,直接调用回调显示图片。如果在内存缓存中没有结果,则需要开启线程进行异步加载。
其次是硬盘缓存,需要从硬盘中进行加载,这里又分为两种情况,一种是缓存的经过编码后的图片,也就是上面介绍的key中包含width、height等各种字段。另一种就是缓存的原始图片,这种情况下,key只有id和signature。它们的顺序是,先尝试加载已经编码后的硬盘缓存,如果有已缓存的图片,则加载流程结束,直接进入显示图片流程。否则,查找缓存的原始图片,并在缓存后对其进行编码等操作。
如果缓存中没有找到图片,则开始真正的请求操作,在请求完毕之后对图片进行缓存编码等工作,然后将其包装一下传递给主线程进行图片的显示工作。
总体上来说,glide的一个基本的加载流程大概就是这样子,这里省略的很多细节性的东西,要想知道完整的流程的话还是得自己去研究一下源码。
这里参考了郭霖老师的两篇文章:
https://blog.csdn.net/guolin_blog/article/details/53939176
https://blog.csdn.net/guolin_blog/article/details/54895665
同时还借鉴了一下这篇文章:
https://alphagao.com/2017/04/20/some-understanding-to-source-code-of-glide/

相关文章

网友评论

      本文标题:Glide图片加载基本流程

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