Retrofit学习笔记

Retrofit学习笔记


本文基于retrofit2.9.0版本记得笔记

大致流程

  1. 调用Retrofit的create方法通过动态代理在运行时创建了接口的代理对象
  2. 在调用接口方法时会调用InvocationHandler的invoke方法,invoke方法会调用loadServiceMethod获取ServiceMethod对象并调用该对象的invoke方法。
  3. loadServiceMethod方法会先在缓存(Map)中找,如果有则取出返回,没有则调用parseAnnotation方法创建ServiceMethod对象并返回
  4. parseAnnotation会先根据方法上的注解生成requestFactory,并返回HttpServiceMethod(ServiceMethod的子类)的parseAnnotation方法的返回值,这里把requestFactory传给HttpServiceMethod
  5. HttpServiceMethod的parseAnnotation会通过createCallAdapter方法找到匹配的callAdapter,再通过createResponseConverter方法找到匹配的converter,再通过Retrofit的配置找到callFactory,最后根据是否是suspend函数创建不同的CallAdapted(HttpServiceMethod的子类)对象并返回(这里先不看suspend分支),这里会通过CallAdapted构造函数把上面找到的callAdapter,converter,requestFactory,callFactory传进去。所以第二步调用invoke方法其实是调用的CallAdapted对象的invoke方法
  6. 先看如何获取callAdapter,Retrofit有默认的callAdapterFactory,但是我们可以通过addCallAdapterFactory方法给数组中添加额外的callAdapterFactory,比如RxJava的callAdapterFactory,要注意的是默认的callAdapterFactory是在我们自己添加的Factory后面的,然后第五步的createCallAdapter方法会遍历这个数组,取出callAdapterFactory对象并调用get方法来判断当前Factory是否匹配,匹配就返回,不匹配接着找,找不到报错
  7. 再看如何获取convert,其实跟获取callAdapter逻辑一样,也是通过遍历数组调用get找匹配的converter等,我们也可以配置
  8. CallAdapted没有重写invoke方法,于是会调用父类HttpServiceMethod的invoke方法,HttpServiceMethod的invoke方法会先创建OkHttpCall对象,然后调用adapter方法这里会把OkHttpCall对象传进去,CallAdapted重写了adapter方法,所以会调用CallAdapted的adapter方法
  9. OkHttpCall主要职责是通过enqueue方法根据requestFactory,converter等创建OkHttp里的Call对象,请求数据,并用converter解析成我们想要的格式
  10. CallAdapted的adapter方法会调用callAdapter的adapter方法,以默认的callAdapter为例,adapter方法会创建ExecutorCallbackCall对象并返回,这里会通过ExecutorCallbackCall的构造函数把OkHttpCall对象传进去
  11. 所以第一步create方法创建的代理对象其实是ExecutorCallbackCall类型对象,我们调用enqueue方法,就是调用ExecutorCallbackCall的enqueue,这个方法会先调用OkHttpCall的enqueue,即第九步在这执行了,然后再切换到主线程后通过我们传进去的回调把数据回调回来
  12. 第十一步能切换到主线程是因为默认的callAdapterFactory构造函数传了一个MainThreadExecutor对象,这是一个主线程线程池,内部其实就是创建了一个主线程的Handler,用这个Handler来post Runnable,所以可以在OkHttpCall的enqueue方法回调中用这个MainThreadExecutor完成切换主线程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值