本文内容:

  1. Retrofit调用进程
  2. Retrofit的规划办法

UML 类图

Retrofit源码阅览攻略

Retrofit的UML图是恰当难画,里边类和接口嵌套恰当的深,这仅仅一个简略图,便利在阅览源码的时分理清接口和结束类之间的联络。

这儿说明一下, Retrofit和okhtkotlin是什么tp结构是强依靠的,所以用okhttp3框起来的是是okhtt线程撕裂者p内源码本钱的代码,其他的则是线程是什么意思Retrofit的,CallAdapter是个例外,我是为了表达子类,结果plantuml辨认成了包

Rekotlin怎样读trofit调用进程

在阅览源码之前先来看一下Retrofit是怎样运用的

public interface GitHubService {
@GET("users/{user}/repoHTTPs")
Call<List&http://www.baidu.comlt;Repo>> listRepos(@Path("user") String user);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.creakotlin为什么盛行不起来te(GitHubService.class);线程池的七个参数
Call<List<Repohttps和http的差异>> repos = service.listRepos("octoc源码网站at");
repos.execute()源码;

上面的摘自官网,工作不了可别怪我。从示例代码中能够看到,Retrkotlin和java差异ofit的运用分为四个进程:

  1. 创立RetrofitKotlin实例
  2. 调用Retrofit.create()创立GitHubService的署理政策
  3. 经过调用署理政策GitHubService.l线程池面试题istReHTTPSpos()办法,获取Call<T>政策
  4. 调用Call.execute()

接下来咱们对这四个进程依次分析HTTPS,至于CallAdapterhttp://192.168.1.1登录Converter的详细情况暂不在本文讨论范围内

Retrofit.Builder.build()

Retrofit实例的创立是经过Build办法进行的,相类似的例如Dialkotlin是什么意思og的创立也是经过Build办法,适合于特征比较多的类型且有默许特征的情况。build()大致情况如下

  1. 供认baseUrl存在,一https认证个Retrofit政策对应服务器上的一个服务
  2. 设置okhttp3.Call.Factory,默许运用OkHttpClient(),这个要记住
  3. 设置从okhttp回调的Executor,默许是用的主线程
  4. 设置CallAdkotlin是什么意思apter和Cokotlin言语nvert,这CallAdapter曾困扰了我好久,一直找不到它的默许结束,便是build()办法没有看仔细,说一下CallAdapter和Convert的效果,CallAdapter用于转化Call<kotlin是什么意思T>,Co源码年代n源码编辑器手机版下载vert则用于转化ResponseBody,这两个都是用了适配器办法
  5. 用上述参数创立Retrofit实例并回来

retrofit.create()

这儿用的动态署理办法,不过这儿或许和你在网上找到的不相同,由于这儿不需求结束接口中的办法

  1. 调用validateServiceInterface()check定义的GithttpwatchhubService是否合法,
    1. 判别源码编辑器编程猫下载当时GithubService是否为接口
    2. 判别GithubService是否带有泛型或许源码编辑器父接口是否带线程和进程的差异是什么有泛型
    3. 判别是否有预先加载validateEagerlyhttpclient,假定有的话就将办法先缓存到serviceMethodC源码之家ache中
  2. 经过Proxy.newProxyInstance()办法创立一个GithubService的署理政策,这儿说明一下newProxyInstance()的三个参数
    1. ClassLoader,这个是用来加载动态proxy类的。万一你想对署理政策做一些骚操作也能够放入一个自定义的ClassLoader
    2. Class<?>[] interfaces,这个便是需求署理的接口,由此可见,其实动态署理能够署理多个接口
    3. InvocationHandler,它能够和你在网上找到的相同作为中介相同反射调用结束类中的办法,也能够直接作为结束类,调用任何办法。

再稍微说明一下动态署理的原理,即经过动态创立一个$Proxy0的类并依据interfaces生成对应源码的办法,然后经过ClassLoader加载到虚拟机中并创立其政策,然后向上转型GithubService接口,接着在结束的办法中直接调用Invocathttps域名ionHandler.invokotlin面试题ke()办法。当分析这些原理的时分不必惧怕,至少他们都仍是要符合基kotlin和java差异本规律,计算机的世界可没有线程同步什么理所当然

service.listRepos()

上面说过,httpclient在调用这个办法的时分,会经过$Proxy0政策直接调用InvocationHandler.invoke(),接下来看一下invoke的逻辑

  1. 假定调用的是ObjeHTTPct类中的办法,能够直接调用即可
  2. 假定是default办法,那也直接调用接口中的default办法
  3. 不然就调用loadServiceMethod()线程加载对应的Method,这儿HTTPS不会有listRepos()的结束办法
  4. 并调用ServiceMethod.invoke()办法发送央求

说明一下为什么不需求listRepos()的结束办法,能够回想一下okhtt源码本钱p的运HTTPS用,它需求的是一个Request,Request则需求许多的参数例如:header,url,http办法类型等等,所以这儿的listRepos()仅仅线程和进程的差异是什么一个存储了Request所需参数的MetHTTPhod政策算了。所以接下来便是直接将Method政策中的参数获取到而且传递给okhttp即可。

Retrofit.loadSe源码rviceMet源码网站hod()

这儿用了一个double-check的办法进行检测ServiceMethod是否现已在缓存中,选用https和http的差异double-check首要是为了效率。

Serhttp://192.168.1.1登录vic源码编辑器eMethod.parseAnnotations()

逻辑如下:

  1. 创立RequestFactory,这步的动作源码年代便是将Method中Annotat线程安全ions解析出来,然后将对应的特征保存起来,源码年代留神:这儿还没有到设置参数这一步,仅仅恰当于指定接HTTP下来要设置哪些Request的参数,这儿边流程虽然不是特https安全问题别凌乱可是很长且需求对于Http的协议字段都了解才行
  2. 检查回来值是否为泛型
  3. 调用Hthttps和http的差异tpServiceMethod.parseAnn线程的几种状况otations()源码网站并回来ServiceMethod政策

HttpServiceMethod.p源码网站arseHTTPSAnnotations()

接下来的逻辑会先去除isKotlinSuspendFunction判别,默许为false

  1. 先获取Method的回来类型,这儿留神会同时加上类型的泛型
  2. 创立CallAdapter,默许是Retrofit.Builder.build()中创立的DefHTTPaultCallAdapterFactory
  3. 创立Convhttps协议ert,这儿留神第一个泛型参数它是okhttp3.ResponseBody,假定没有httpwatch加ConvertFactory,那么只能运用这品种型
  4. 回来创立的CallAdapted

HttpServiceMethod.inKotlinvoke()

在回来ServiceMethod类型之后,直接调用Servkotlin和javaiceMethod.invoke()源码编辑器这个办法由HttpSer源码之家viceMethod进行结束,

  1. 创立OkHttpCall政策
  2. 运用调用http协议对应的CallAdapter进行政策转化,默许不进行转化

repos.execute()

回到UML中看一下Callhttps域名的结束类,便是OkHttpCall,所以直接看OkHttpCall.execute()的逻辑

  1. 首先调用getRawCall()获取okhttp3.Call,假定没有则进行创立
  2. 之后调用okhttp3.Call.execute()调用到okhttp中实施对应源码年代的逻辑

这儿便是Retrofit最终的逻辑了,接下来看一下怎样获取ok源码年代http3.Call

OkHttpCall.getRawCall()

判别是否有现已创立了的ohttp协议khttp3.Chttps协议all政策,假定没有,则调用createRawCall()进行创立

OkHtthttpwatchpCall.createRawCall()

调用okhttp3.Call.Factohttps安全问题ry.newCall()创立一个okhttp3.Call方kotlin言语针,而且运用RequestFactory创立okhttp3.Request

RequestFactory.create()

这儿也是用的build办法,

  1. 创立RequestBuilder,能够看到RequestF线程池actory和Rhttps协议equestBuilder的特征几乎相同
  2. 调用RequestBuilder.get()创立okh线程撕裂者ttp3.RequeKotlinst.Builder
  3. 再经过okhttp3.Request.Builder创立okhttp3.Requesthttps安全问题

Retrofit的规划办法

  1. B源码年代uild办法,用这个办法的有创立Retrofit政策,创立RequestF源码网站actory政策,以及okhttp3.Request.Builder政策,用Buildkotlin怎样读办法创立Builder。这种办法之前说明过,用于创立特征较多的政策
  2. 工厂办法办法,线程同步用于创立扩展性较高的政策。例如:okhttp中的Call政策,意味着能够直接依据okhttp创立自己的网络结构。Convert政策和CallAdapter政策均是这样,进步结构的可扩展性
  3. 适配器办法,这种常用于类型转化,将一品种https和http的差异型转为另一品种型,最常见的如ListView和RecyclerView,便是将数据源转为View政策,并不关心数据源是什么姿态的,只需能够经过它创立对应的View方线程安全针即可。Retrofit对应的便是Convert和CallAdapter这两个,CallAdaptekotlin面试题r能够将Call或许Call的子类型直接转为另一个类型(准确来说,这是不对的ServiceMetkotlin怎样读hod并没有约束泛型的上下界,仅仅举例便利),Convert则是将ResponseBody转为指定的类型
  4. 署理办法,之前现已讲的比较清楚了,首要用在GitHubService接口办法上,将okhttp3http 302.Request的特征署理成接口办法调用,削减耦合度,而且下降kotlin为什么盛行不起来线程同步用的凌乱性。我觉得这是retrofit的中心,简化okhttp的调用