不废话 先上图
![](https://img.haomeiwen.com/i13065404/b2846feb6bb34c1f.jpg)
我们首先从它的属性开始看起 第一个是一个MAP集合 这个暂时留着后面看 后面是okhttp和HttpUrl 这个两个属性 不多说然后就是两个list集合 一个创建线程的接口 Okhttp dispatcher 这篇源码解析里面 解释过 接着继续往下翻
![](https://img.haomeiwen.com/i13065404/7b4b8c1ccf8123bf.jpg)
到了creat的这个方法 我们先简略的 可以看出 这是一个动态代理模式 我们接着一句一句的来看
![](https://img.haomeiwen.com/i13065404/ad9bfde4d2a45932.jpg)
首先我们进入到第一个代码里面 可以 发现是一个工具类 的方法 这个方法判断了 我们使用Retrofit 要创建的Service那个接口类 是否为接口 然后是否继承了其他接口 我们接着往下面看 首先是一个FLAG判断 具体是什么意思暂时不清楚 我们先进入其中的方法看下
![](https://img.haomeiwen.com/i13065404/18cfe5d9dceaee54.jpg)
这个方法首先是对平台做了一个判断 然后通过一个for循环不断反射获取到service类的方法
![](https://img.haomeiwen.com/i13065404/9a305813bf75bff2.png)
然后进行一个判断是否Java8支持的DefaultMethod 再接着进入加载Service这个方法里面
![](https://img.haomeiwen.com/i13065404/edef5e5ad3076b92.png)
第一句就是从serviceMethodCache这个缓存MAP集合中获取service缓存 如果有数据 则返回数据 否则则NEW一个新的ServiceMethod的建造者方法 传入参数 最后加入缓存集合 我们可以进去看下ServiceMethod的建造者方法
![](https://img.haomeiwen.com/i13065404/844e8ab7ca155705.png)
这个构造函数可以看出 主要是获取传入方法里面的 注解等参数然后我们再进入builde这个方法里面去看下
![](https://img.haomeiwen.com/i13065404/e80c83192d2fe0bd.png)
![](https://img.haomeiwen.com/i13065404/9faf5b9651a7e80e.png)
从这两张图里面可以看出 获取service中的注解并进行了一系列的解析和转换操作 (POST GET啥的) 并且最后New了一个新的ServiceMethod类 好了 我们再回到前面的 create方法中 下面就是动态代理部分的代码了
![](https://img.haomeiwen.com/i13065404/80d78d04ab41b7f6.png)
(动态代理不了解的小伙伴 可以去简书里面搜一搜 很多) 首先依然是做了一个版本判断 然后在invoke方法中
第一个判断是否是一个来自Object的方法,如果是则遵循正常调用。 第二个判断是判断是否Java8支持的DefaultMethod(上面也写到过)这个方法我们就不看了 最后获得一个ServiceMethod的实例 (loadServiceMethod这个方法返回的是一个实例 前面分析了)传入okhttpCall中 并返回一个serviceMethods.adapter方法 我们再进去看下
![](https://img.haomeiwen.com/i13065404/59e9336cb0cd7e09.png)
这个 CallAdapter接口其实是用来创建一个抽象工厂类的接口 后面再说 这次的源码分析就到此为止
网友评论