Android网络开源库-Retrofit(六)源码浅析-上
Retrofit配置RxJava真的很好用。希望亲们看的时候,自己也看下代码,这样效果最好了。1. 初始化过程一般来说,我们通过Builder去初始化Retrofit。我们看看支持我们配置那些呢。如下图: platform 平台信息(java,android,ios)callFactory 进行实际请求的(一般为okhttpclient)baseUrlbaseUrlconvertFac
Retrofit配置RxJava真的很好用。
希望亲们看的时候,自己也看下代码,这样效果最好了。
1. 初始化过程
一般来说,我们通过Builder去初始化Retrofit。我们看看支持我们配置那些呢。如下图:
- platform 平台信息(java,android,ios)
- callFactory 进行实际请求的(一般为okhttpclient)
- baseUrl baseUrl
- convertFactories 包装器集合,对请求数据和响应数据进行包装的东西
- adapterFactories 适配器集合,用来配置其他框架使用的,如RxJava
- callbackExecuter 执行回调的小玩意
- validateEagerly 是否先进行ServiceMethod的初始化(稍后就介绍ServiceMethod)
我们针对platform和callbackExecuter来说下。
2. Platform 平台信息
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<T, String>) 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来执行,后面的事,就不说了。
如果觉得对您有帮助,点一波关注吧。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)