什么是 Retrofit

A type-safe HTTP client for Android and Java

与 OkHttp 的关系

notion image
notion image

源码入口

从 retrofit 的使用步骤中,可以知道,retrofit.create(service) 是整个 retrofit 的入口

create函数

  • create 方法中,通过 动态代理 的方式,对传入的 service 进行代理,并进行一定检查
  • 可以看出,create() 会先调用 validateServiceInterface(service) 进行判断,如果不符合要求,就会报错,这也是保证 Retrofit type safe 的一个手段
  • 通过了类型判断后,就会对其进行动态代理了,从代码可以看出,只代理了我们自定义的方法,而 Object 类的方法是不会被代理的
  • 最后,根据方法是否是 default 方法,进行了不同的调用,需要注意的是,这里的 loadServiceMethod(method) 里面有个 缓存机制,也是用于获取实际要运行的方法的

validateServiceInterface 函数

  • 从代码即注释可以看出,validateServiceInterface() 的作用就跟函数名字一样,主要是用于校验所代理是 service 是否合理

loadServiceMethod 函数

  • 这个方法很短,主要用于返回 ServiceMethod 对象,如果 cache 中有,就直接复用,否则就用 ServiceMethod.parseAnnotations(this, method) 解析出来一个,因此,核心还是在 parseAnnotation() 方法上,下面来分析看看

ServiceMethod.parseAnnotations 方法

  • 从代码看到,ServiceMethod.parseAnnotations 其实就是通过构造出 requestFactory,进而将构造 ServiceMethod 对象的任务,交给 HttpServiceMethod.parseAnnotations()
  • 顺便看看 RequestFactory.parseAnnotations(retrofit, method) 的源码:

    HttpServiceMethod.parseAnnotations 方法

    • 可以看到,这个方法,最后会返回一个 CallAdapted(),所以再来看看 CallAdapted 的定义

    CallAdapted 类

    CallAdapter 类

    • 到这里,其实就能看出,Retrofit 对于网络请求的解析和执行已经结束了,CallAdapter 的作用,也是把结果适配成我们接口定义时候的格式而已,所以,整个 retrofit 网络处理的流程就算是结束了
    • 但是,到这里,还是不能体现 Retrofit 是在 OkHttp 基础上进行的封装 这个观点,所以,下面再来看看 HttpServiceMethod

    HttpServiceMethod 类

    总体流程

    发起请求
    notion image
    响应请求
    notion image
    • 注:以上两张图片引用自 Understand How does Retrofit work,这同样是一篇很不错的文章,里面介绍了整个 Retrofit 的大体流程,推荐一起学习

    参考/推荐

    Paging3 源码解析JNI 基本概念一
    Loading...