type
status
date
slug
summary
tags
category
password
icon

Retrofit 使用方法简介

  1. 创建一个 interface 作为 Web Service 的请求集合,在里面用注解(Annotation)写入需要配置一个请求方法。
    1. 在正式代码⾥⽤ Retrofit 创建出 interface 的实例
      1. 调⽤创建出的 Service 实例的对应⽅法,创建出相应的可以⽤来发起⽹络请求的 Call 对象
        1. 使⽤ Call.execute() 或者 Call.enqueue() 来发起请求

          Retrofit源码结构总结

          核心:动态代理 代理:创建一个类去实现需要代理的接口(可能有多个),这些接口的的方法在调用时都会去调用这个类的一个对象,而这个类就被称为代理类,类的对象就是实际做事的。 动态代理:创建的类是在运行是生成的。
          • 通过 Retrofit.create(Class) ⽅法创建出 Service interface 的实例,从⽽使得 Service 中配置的⽅法变得可⽤,这是 Retrofit 代码结构的核⼼
          • Retrofit.create() ⽅法内部,使⽤的是 Proxy.newProxyInstance() ⽅法来创建Service 实例。这个⽅法会为参数中的多个 interface (具体到 Retrofit 来说,是固定传⼊⼀个 interface)创建⼀个对象,这个对象实现了所有 interface 的每个⽅法,并且每个⽅法的实现都是雷同的:调⽤对象实例内部的⼀个 InvocationHandler 成员变量的 invoke() ⽅法,并把⾃⼰的⽅法信息传递进去。这样就在实质上实现了代理逻辑:interface 中的⽅法全部由⼀个另外设定的 InvocationHandler 对象来进⾏代理操作。并且,这些⽅法的具体实现是在运⾏时⽣成interface 实例时才确定的,⽽不是在编译时(虽然在编译时就已经可以通过代码逻辑推断出来)。这就是⽹上所说的「动态代理机制」的具体含义
          • 因此,invoke() ⽅法中的逻辑,就是 Retrofit 创建 Service 实例的关键。这个⽅法内有三⾏关键代码,共同组成了具体逻辑:
            • ServiceMethod 的创建:
              • 这⾏代码负责读取 interface 中原⽅法的信息(包括返回值类型、⽅法注解、参数类型、参数注解),并将这些信息做初步分析。实际返回的是⼀个 CallAdapted 。
            • OkHttpCall 的创建:
              • OkHttpCallretrofit2.Call 的⼦类。这⾏代码负责将 ServiceMethod 解读到的信息(主要是⼀个 RequestFactory 、⼀个 OkHttpClient 和⼀个 ResponseConverter )封装进 OkHttpCall ;⽽这个对象可以在需要的时候(例如它的 enqueue() ⽅法被调⽤的时候),利⽤RequestFactoryOkHttpClient 来创建⼀个 okhttp3.Call 对象,并调⽤这个 okhttp3.Call 对象来进⾏⽹络请求的发起,然后利⽤ ResponseConverter 对结果进⾏预处理之后,交回给 Retrofit 的 Callback
            • adapt() ⽅法:
              • 这个⽅法会使⽤⼀个 CallAdapter 对象来把 OkHttpCall 对象进⾏转换,⽣成⼀个新的对象。默认情况下,返回的是⼀个 ExecutorCallbackCall ,它的作⽤是把操作切回主线程后再交给 Callback
                另外,如果有⾃定义的 CallAdapter,这⾥也可以⽣成别的类型的对象,例如 RxJava 的Observable ,来让 Retrofit 可以和 RxJava 结合使⽤。
          notion image
           
          从 OkHttp 的原理来看 HTTPKotlin-基础
          Loading...
          shuouyang
          shuouyang
          android开发 ReactNative开发 小程序开发
          最新发布
          AOSP 环境搭建
          2025-3-29
          View 绘制流程-源码解析
          2025-3-12
          HTTP
          2025-3-4
          JVM 虚拟机
          2025-2-28
          蓝牙-BLE-基础
          2025-2-28
          从 OkHttp 的原理来看 HTTP
          2025-2-19
          公告
          🎉热点信息🎉
          --- 1 ---
          Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
          --- 2 ---
          新的小巧便捷的依赖注入框架 Koin
          --- 3 ---
          新一代 API 查询语言 GraphQL