Re本篇是从整体上来说明Retrofit的结构:
相信很多开发者在使用Okhttp的时候也对其进行过封装,github上也能搜到不少Okhttp封装的源码;总的来看Retrofit是Okhttp的二次封装。其实不论怎么封装,封装的核心只不过是对Request和Response的构建做一个相应的变化而已,到头来真正执行网络请求的还是Okhttp的Call对象:同步请求为call.execute();异步请求为call.enqueue();那么Retrofit对Okhttp做了怎么的封装设计呢?
其实Retrofit从整体上看主要添加了两个接口集合:
.addConverterFactory(GsonConverterFactory.create(initGsonConverter()))// Converter集合
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //CallAdapter集合
其中两个集合的作用通过下图可以直观的表达出来:
也即是说api方法的返回值类型决定了使用哪一个CallAdapter,而返回值所包含的泛型的真实类型决定了使用哪一个Converter。
或者说每个Api方法的返回类型都需要一个CallAdapter对象和一个Converter与之对应。且每一个API方法都对应封装成一个ServiceMethod对象,所以下图就不难理解了:
具体是怎么从上面两个集合中检索的所需的CallAdater和Converter对象的。而Retrofit的扩展性也主要体现在CallAdapter和Converter两个接口的实现而已,比如Retrofit的内部就提供了如下CallAdapter:
和如下几个Converter
所以结合上面的讲解Retrofit的整体流程图就出炉了:
到此为止Retrofit源码分析讲解完毕