retrofit2简易源码解析

构建retofit是通过builder来设置参数,直接看源码中的build()
1.如果callFactory为空则新建一个OkHttpClient对象
2.设置回调所在线程,默认是在主线程(这里有个Platform类,用于在不同平台上获取主线程,并且获取默认的callAdapter就是在主线程直接返回call)
3.用两个列表来装添加的callAdapter和converter
4.构造retrofit实例
5.build可以设置一个boolean值,用来标示在create的时候是否提早构建serviceMothed并缓存起来


接下来就根据得到的实例调用create方法
1.判断接口类是否符合retofit的标准(是否是接口,是否只存在一个接口)
2.为接口里的每个方法生成一个ServiceMothed
3.ServiceMothed通过build来构建,根据在接口里面写的方法的注解,返回值,方法参数,来生成ServiceMothed的变量(具体看代码)
4.通过动态代理发送请求并返回结果
5.代理里会根据当前method的ServiceMothed和参数来生成OkHttpCall对象,根据mothed的返回值来找到所对应的callAdapter,通过callAdapter的adapt方法传入okhttpcall实例到callAdapter中
6.OkHttpCall类里面就是调用okhttp的过程,里面有两个主要的方法,enqueue(异步调用),execute(同步调用),都会调用createRawCall生成OkHttp实例,createRawCall方法里通过ServiceMethod生成Request,并调用OkHttp的newCall方法
7.所以retrofit能够形成不同类型的返回值都是通过method的返回值来判断构建retrofit实例的时候是否添加了相应的callAdapter,每个callAdapter内部都会调用OkHttpCall的enqueue或者execute来请求数据并返回


对OkHttp的理解
OkHttp的入口是newCall方法,通过传入的request生成call,newcall里面生成了RealCall对象
RealCall实现了Call接口,里面有execute(同步调用)和enqueue(异步调用)两种调用方式,可以看到里面都有个getResponseWithInterceptorChain方法,把所有的Interceptor都放入一个列表中,然后根据责任链模式来遍历Interceptor,中途如果发现满足条件可以直接返回Response不再向下运行,这里就是整个OkHttp的主体,通过Interceptor把对OkHttp的各种设置分成多个模块
通过dispatcher来派生Call,异步通过线程池来调用,会生成一个AsyncCall,如果满足条件可以直接execute,并把AsyncCall放入running的列表当中,如果当前运行数太多就放入ready列表中
无论getResponseWithInterceptorChain是否调用成功都会调用dispatcher的finished方法,从running列表中删除call,如果是异步调用的就调用promoteCalls方法,从ready列表中拉出一个call放入running列表中并调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值