Android 网络开源库 - Retrofit(六) 源码浅析 - 上

阅读 707
收藏 45
2016-10-11
原文链接:blog.csdn.net

Retrofit配置RxJava真的很好用。
希望亲们看的时候,自己也看下代码,这样效果最好了。

1. 初始化过程

一般来说,我们通过Builder去初始化Retrofit。我们看看支持我们配置那些呢。如下图:
这里写图片描述

  • platform 平台信息(java,android,ios)
  • callFactory 进行实际请求的(一般为okhttpclient)
  • baseUrl baseUrl
  • convertFactories 包装器集合,对请求数据和响应数据进行包装的东西
  • adapterFactories 适配器集合,用来配置其他框架使用的,如RxJava
  • callbackExecuter 执行回调的小玩意
  • validateEagerly 是否先进行ServiceMethod的初始化(稍后就介绍ServiceMethod)

我们针对platform和callbackExecuter来说下。

Android为例,如图
这里写图片描述

callbackExecuter,就是defaultCallbackExecutor返回值,对应Android平台也就是这个了。这里就不多介绍了哈。

3. Retrofit#create

这个方法中,用动态代理的方式,构建出我们的ApiService。瞟一眼代码。
这里写图片描述

上面提到的validateEagerly,在这里起到作用了,eagerlyValidateMethods方法体中是什么呢?看一下。
这里写图片描述
没错,也是loadServiceMethod,和我们在InvocationHandler中load并没有很么区别,唯一的区别就是先手顺序了。

create方法非常重要的三步骤,就是最下面的三行代码。

  • 构建ServiceMethod
  • 构建OKHttpCall
  • 构建ApiService

ok,我们继续。

4. ServiceMethod

先来看看loadServiceMethod方法。
这里写图片描述
优质代码无处不在!!!ServiceMethod被缓存起来,没有缓存,在初始化。平常没有缓存这种思想,一定要注意了。

我们来看ServiceMethod.Builder的初始化方法干了什么。
这里写图片描述

这里就是获取我们的注解信息

  • getAnnotations 获取方法的注解
  • getGenericParameterTypes 获取参数的类型
  • getParameterAnnotations 获取参数的注解

接下来,就是build方法了。这个方法很重要,也是核心。代码稍长,我们分段来看,啦啦啦。
这里写图片描述

  • 初始化callAdapter
  • 出实处responseType
  • 初始化responseConverter

createCallAdapter,根据method的返回值和注解返回callAdapter
这里写图片描述
会调用Retrofit类的这里。
这里写图片描述
我们添加RxJava的Adapter,用Observable<>的时候,就会返回RxJavaAdapter,当然,有一个默认的Adapter,就是这个DefaultCallAdapterFactory。

responseType,DefaultCallAdapterFactory就是Call<?> 中?的部分,为什么呢?这是由于会使用utils来获取泛型参数类型的关系

同理createResponseConverter,也调用了Retrofit里的方法,返回对应的Converter,当然,这里也有个默认的BuiltInConverters,如果我们添加了GsonConverter的话,就会返回Gson相关的。

然而,这并没有完,接下来会解析methodAnnotations。将都安排哟普那个parseMethodAnnotation方法,我们以解析POST为例。 parseHttpMethodAndPath(“POST”, ((POST) annotation).value(), true);如图:
这里写图片描述

  • 确保url中参数不含{}块,要用@Query来替代,就是说url不能是/xxx?name={xx},这样的。
  • 解析url中查询参数

解析其他标签,也类似,当然,有几个不同,如图:
这里写图片描述

到这里。你以为ServiceMethod.Builder#build完了么?年轻,继续
这里写图片描述
这部分代码是干啥子。当然是解析参数中的注解了。
请留意一下ParameterHandler类,我们稍后会用到

parseParameter,解析了我们的参数的注解,返回ParameterHandler。
这里写图片描述
我们重点看下parseParameterAnnotation方法,这个方法巨长。我们看下Field相关的一段。
这里写图片描述

  • 参数类型是Iterable
  • 参数是Array
  • 其他

三种参数类型对应的代码,唯一的区别就在与Converter。一般来说,我们传的Field为String(以简单的来看。。。),那么最终就会调用下面这行代码(Retrofit.class里面)

return (Converter) BuiltInConverters.ToStringConverter.INSTANCE;

,没错,默认的Convert。现在我们回过头来,来看ParameterHandler类。这次我们看他的子类,ParameterHandler.FIeld类。
这里写图片描述

,哈,到这里,这个类只是浮现在我们的眼前,他的关键用处,让我们回到Retrofit#create方法。

ps:到这里,ServiceMethod暂时完结了。

5. Retrofit#create方法剩下的两行代码

OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);

adapt 干了什么呢?默认的是DefaultCallAdapterFactory,(我们平常使用RxJavaCallAdapter),而DefaultCallAdapterFactory.adapt直接返回okhttpCall。我们接下来就会调用OkHttpCall的enqueue方法。到这里,就基本将后续交给OkHttp了。不过,在enqueue方法中会调用createRawCall。

6. OkHttpCall#createRawCall

Request request = serviceMethod.toRequest(args);

亚哈,又转区serviceMethod的。

7. serviceMethod#toRequest

这里写图片描述

看到没。这行代码中,出现了parameterHandlers。并且出现了apply。

我们看看去。还是以Field为
这里写图片描述

apply方法,调用RequestBuilder的addFormField方法,添加一个表单字段,其他同理。
最后,调用build方法,组装完成的Request,然后交给Okhttp来执行,后面的事,就不说了。

如果觉得对您有帮助,点一波关注吧。

评论