glide源码阅读系列(一)
我掐指一算今天适合读源码,没错就从glide开始,不是什么完全解析,不是什么加载原理,就是读,往死里读,Read The Fucking Source Code。
先把glide源码下载到AS,然后来看看glide的工程目录结构:
![](https://img.haomeiwen.com/i13842135/78ced28b2cb5e936.png)
很明显上帝告诉我应该从glide和library这两个module开始读,于是我兴奋的点开了它们:
![](https://img.haomeiwen.com/i13842135/9b5fb555707c45c4.png)
glide是个空module,很棒棒,成功的欺骗了我,看来重点是library啊,于是我又兴奋的点开了library:
![](https://img.haomeiwen.com/i13842135/8e94cd8a2e3f093c.png)
这里面全是glide的精华啊,很棒棒,今天就从Glide这个类开始读吧,走起...
首先源码肯定不能像小说那样逐字逐句的从上往下读啊,回顾一下glide是怎么用的:
Glide.with(context).load(pic).into(imageView);所以我们先从这个with方法入手,
![](https://img.haomeiwen.com/i13842135/241ef828c108636b.png)
在Glide这个类里面with方法一共有四个重载方法,它们只是传入的context类型不一样,最终它们都去调getRetriever()这个方法,我们先顺着这条线往下捋
![](https://img.haomeiwen.com/i13842135/0f4fb3c0f03edfbf.png)
![](https://img.haomeiwen.com/i13842135/747723db2c71c3af.png)
![](https://img.haomeiwen.com/i13842135/d07f84d5b519f432.png)
![](https://img.haomeiwen.com/i13842135/5514a7bbb8254897.png)
![](https://img.haomeiwen.com/i13842135/dbd051333d5a7194.png)
可以看到getRetriever()这个方法先通过Glide的get方法获取Glide的单列,在获取Glide单列的时候进行了初始化操作,初始化操作的内容看起来非常陌生,没关系,先跳过,等我把整体源码撸清楚后再回来收拾它。getRetriever()方法在获取到Glide的单列之后调用了Glide的getRequestManagerRetriever()方法:
![](https://img.haomeiwen.com/i13842135/2e2633656bd271d1.png)
这个方法返回了RequestManagerRetriever对象,我们来看看这是个什么鬼:
![](https://img.haomeiwen.com/i13842135/a7ff74f2a05c1318.png)
注释说这是一个获取RequestManager对象的东西,那么RequestManager又是什么鬼:
![](https://img.haomeiwen.com/i13842135/adff5d708f52074c.png)
注释又说了这是一个管理和启动Glide请求的类,这是个好东西呀,今天先不管它,我们先回到Glide这个类,刚才说getRequestManagerRetriever()返回了一个RequestManagerRetriever对象,但是这个对象在哪初始化的呢,来一起看看:
![](https://img.haomeiwen.com/i13842135/21fedd2982cf1721.png)
可以看到它是在构造的时候传入的,Glide构造方法是GlideBuilder这个类调用的,而RequestManagerRetriever这个对象是直接new出来的:
![](https://img.haomeiwen.com/i13842135/c289111cb5219cf9.png)
GlideBuilder先放一放,我们再次回到Glide,我们来看看它的构造到底干了什么:
![](https://img.haomeiwen.com/i13842135/e8b1a4d5b4ba8def.png)
![](https://img.haomeiwen.com/i13842135/a5438e72501bba56.png)
![](https://img.haomeiwen.com/i13842135/2ade4aada3229e66.png)
![](https://img.haomeiwen.com/i13842135/0566234be83ecd94.png)
glide构造方法代码很长,我只贴了一部分,这个方法主要是给声明的变量赋值,赋值的细节后面把其他类读懂了再补充。读到这里Glide这个类的核心方法已经过了一遍,感觉并没有什么收获,哇哈哈哈,真是想笑。
今天我们主要通过Glide这个类看了Glide.with(context)方法,没有学到任何东西,没关系,我们已经迈出了一小步,正所谓万丈高楼平地起,接下来我先去喝杯咖啡,下期再见。