1、retrofit总流程
- 接口-注解(Build Request)
- 网络请求执行器 Call
- 网络请求适配器
- CallAdapter如果用户选择了,可以通过addAdapterFactory(RxJavaCallAdapterFactory.create())将
OkhttpCall对象转换成RxJava平台的Call
- CallAdapter如果用户选择了,可以通过addAdapterFactory(RxJavaCallAdapterFactory.create())将
- 网络请求执行器
- 代理模式
- 数据转换器
2、代理实例创建过程
Retrofit mRetrofit = new Retrofit.Builder().baseUrl("myurl").
addConverterFactory(GsonConverterFactory.create(new Gson()))
// .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
CommonService commonService = mRetrofit.create(CommonService.class);//CommonServiceProxy
2.1、创建 mRetrofit
- 有哪些参数
- baseURL
- 网络请求的url地址
- callFactory
- 网络请求工厂,实际上就一个Okhttp
- callbackExecutor
- 如果不自行设置,Retrofit会根据平台设置一个默认的Executor。callbackExecutor是Retrofit.Callback接口中的一个属性,可以用来指定回调执行的线程,例如在异步请求数据时,可以在主线程之外的线程执行回调。
- adapterFactories
- 将Call转化,默认的话,OKhttp执行的结果会被handler来执行线程切换操作。如果需要支持RxJava,就可以通过addAdapterFactory(RxJavaCallAdapterFactory.create())将Call对象转换成RxJava平台的Call1。
- converterFactories
- 转换数据用的,比如string转为jsonbeanaddConverterFactory(GsonConverterFactory.create()),就是设置返回的数据支持转换为Gson对象。
2.2、mRetrofit.create()得到代理对象
ICommonService commonService = mRetrofit.create(ICommonService.class);//CommonServiceProxy
-
create里其实用了动态代理,具体看我这篇设计模式(2)-动态代理-大白话版 - 掘金 (juejin.cn)
-
也就是commonService的任何函数都会调用invoke, 这个invoke函数也就是retrofit里面 invoke函数。所以,动态代理可以代理所有的接口,让所有的接口都走 invoke函数, 那么ICommonService里的哪些注解啥的就都被用来生成okhttpcall
-
动态代理创建
2.3 commonService创建call
Call<Object> objectCall = commonService.addGiveLike(1001);
Mehtod和args传进了OkhttpCall,
Request request = serviceMethod.toRequest(args);
然后serviceMethod通过args参数创建了一个request,然后request生成了okhttp的call,后面的不在这一步,我大概讲一下(然后这个call enqueue()或者execute(),生成response,通过callSuccess()传出去)
serviceMethod.callAdapter.adapt(okHttpCall);
-
默认将okhttpcall转为适配适合的call(ExecutorCallbackCall)
- defaultCallAdapterFactory是对executorCallAdapterFactory的封装。
- executorCallAdapterFactory则是对callbackExecutor的封装,就是一个代理。
2.4 call请求然后解析数据
objectCall.enqueue(new Callback<Object>() {
@Override
public void onResponse(Call<Object> call, Response<Object> response) {
}
@Override
public void onFailure(Call<Object> call, Throwable t) {
}
});
这个responseConverter就是serviceMehtod里的,也就是retrofit里创建的。