一张图读懂Retrofit

本文介绍了如何阅读Retrofit的源码,从寻找切入点开始,逐步理解其核心模块,包括Retrofit配置、动态代理、ServiceMethod、CallAdapter和Converter。通过UML时序图展示了CallAdapter和Converter的创建过程,以及请求和响应的处理流程。虽然Retrofit设计简洁,但要完全掌握仍需深入研究。

如何读源码

三部曲:

  1. 寻找切入点,带着将源码整体化,结构化的意识,开始阅读
    • 从切入点开始将代码一小步一小步的进行模块化的记忆
    • 遇到无法切入时,可以先切换到另一个小模块进行挖掘
    • 建议的切入点:使用中最接近逻辑开始的地方。如网络请求框架的开始请求的地方:retrofit2.Call.enqueue
  2. 阅读的过程中,时刻保持将代码尽心体系化,完整化的意识
    • 每次将小模块完成之后,再进行下一个小块的完善,直到心中有一个完整的整体模块
  3. 时刻保持一个明确的目的进行阅读
    • 阅读的过程中可能会出现需要纵向深入和横向发散的情况,这个时候就需要明确一个方向阅读

Retrofit源码笔记

关键类:

  1. retrofit2.Retrofit 总体配置:如CallAdapter、Converter等
  2. java.lang.reflect.Proxy:动态代理
  3. ServiceClass,使用Retrofit定义网络请求的接口,需要通过动态代理实现(提示:源码有标注这是个啥)
  4. ServiceMethod,Retrofit解析接口得出的网络请求构建类(提示:源码有标注这是个啥)
    1. 解析出ServiceClass的所有网络请求方法
    2. 转换网络请求的返回
    3. 切换网络请求和返回数据的线程
  5. CallAdapter 配置网络请求,切换线程
  6. Converter 用于转换网络请求的返回为需要的类型

示例源码:

class MainActivity : AppCompatActivity() {
    val TAG = "MainActivity"
    val permissionRequestCode = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val gson = Gson()
        val retrofit = Retrofit.Builder()
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl("https://blog.youkuaiyun.com/")
            .build()
        val baiduService = retrofit.create(BaiduService::class.java)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(arrayOf(Manifest.permission.INTERNET), permissionRequestCode)
        }
        baiduService.doGet("ItsFated").enqueue(object: Callback<ResponseBody> {
            override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                Log.d(TAG, "onResponse: $call, $response")
            }
            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                Log.d(TAG, "onFailure: $call, $t")
            }
        })
    }
}
/*这个就是ServiceClass*/
interface BaiduService : Serializable {
    /*这个就是ServiceMethod*/
    @GET("{path}")
    fun doGet(@Path("path") user: String): Call<ResponseBody>
}

UML时序图,如下:
retrofit图中有几点需要说明下:

  1. CallAdapter和Converter的设计是完全一样的(作用当然不一样)
    1. 创建均是通过设置在Retrofit中的CallAdapters(或Converters)工厂列表来进行创建,遍历工厂列表,找到第一个可以创建对象的工厂类进行类的创建
    2. 基类的设计完全一样:产品类中同时定义了工厂类,通过工厂类创建对应的CallAdapter和Converter
  2. Converter在图中只是展示了Response的转换,还有Request转换等逻辑没有展示出来,有兴趣的可以自行学习,相关逻辑在RequestFactory中
  3. 图中的逻辑是对应贴出来的代码,顺序:retrofit.create,doGet,enqueue。图中就是按照这三个方法进行绘制

当然这个标题是开玩笑的,虽然Retrofit设计比较简单,不过读懂还是有一定难度,文章只是宏观上梳理了Retrofit的基本设计和请求逻辑。(__) ……

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值