如何读源码
三部曲:
- 寻找切入点,带着将源码整体化,结构化的意识,开始阅读
- 从切入点开始将代码一小步一小步的进行模块化的记忆
- 遇到无法切入时,可以先切换到另一个小模块进行挖掘
- 建议的切入点:使用中最接近逻辑开始的地方。如网络请求框架的开始请求的地方:retrofit2.Call.enqueue
- 阅读的过程中,时刻保持将代码尽心体系化,完整化的意识
- 每次将小模块完成之后,再进行下一个小块的完善,直到心中有一个完整的整体模块
- 时刻保持一个明确的目的进行阅读
- 阅读的过程中可能会出现需要纵向深入和横向发散的情况,这个时候就需要明确一个方向阅读
Retrofit源码笔记
关键类:
- retrofit2.Retrofit 总体配置:如CallAdapter、Converter等
- java.lang.reflect.Proxy:动态代理
- ServiceClass,使用Retrofit定义网络请求的接口,需要通过动态代理实现(提示:源码有标注这是个啥)
- ServiceMethod,Retrofit解析接口得出的网络请求构建类(提示:源码有标注这是个啥)
- 解析出ServiceClass的所有网络请求方法
- 转换网络请求的返回
- 切换网络请求和返回数据的线程
- CallAdapter 配置网络请求,切换线程
- 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时序图,如下:
图中有几点需要说明下:
- CallAdapter和Converter的设计是完全一样的(作用当然不一样)
- 创建均是通过设置在Retrofit中的CallAdapters(或Converters)工厂列表来进行创建,遍历工厂列表,找到第一个可以创建对象的工厂类进行类的创建
- 基类的设计完全一样:产品类中同时定义了工厂类,通过工厂类创建对应的CallAdapter和Converter
- Converter在图中只是展示了Response的转换,还有Request转换等逻辑没有展示出来,有兴趣的可以自行学习,相关逻辑在RequestFactory中
- 图中的逻辑是对应贴出来的代码,顺序:retrofit.create,doGet,enqueue。图中就是按照这三个方法进行绘制
当然这个标题是开玩笑的,虽然Retrofit设计比较简单,不过读懂还是有一定难度,文章只是宏观上梳理了Retrofit的基本设计和请求逻辑。(__) ……

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

被折叠的 条评论
为什么被折叠?



