code 小生 一个专注 Android 领域的技术平台
公众号回复 Android 加入我的安卓技术群
作者: DB_BOY 链接: https://www.jianshu.com/p/491603d9fadc 声明: 本文已获 DB_BOY 授权发表, 转发等请联系原作者授权
本着针对面试, 不负责任的态度, 写下《面试总结》系列. 本系列记录面试过程中各个知识点, 而不是入门系列, 如果有不懂的自行学习.
涉及到的设计模式
外观模式, 构建者模式, 工厂模式, 代理模式, 适配器模式, 策略模式, 观察者模式
概括
Retrofit 就是一个网络请求框架的封装, 底层的网络请求默认使用的 Okhttp, 本身只是简化了用户网络请求的参数配置等, 还能与 Rxjava 相结合, 使用起来更加简洁方便.
App 应用程序通过 Retrofit 请求网络, 实际上是使用 Retrofit 接口层封装请求参数, 之后由 OkHttp 完成后续的请求操作.
在服务端返回数据之后, OkHttp 将原始的结果交给 Retrofit,Retrofit 根据用户的需求对结果进行解析.
完成数据的转化 (converterFactory), 适配 (callAdapterFactory), 通过设计模式进行各种扩展.
使用
@GET("/user/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); //call 封装了整个 okhttp 的请求 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverteractory.create()) //.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); //converterFactory // 后续交个 okhttp
Retrofit 请求七步骤
添加 Retrofit 依赖, 网络权限
定义接收服务器返回数据的 Bean
创建网络请求的接口, 使用注解 (动态代理, 核心)
builder 模式创建 Retrofit 实例, converter,calladapter...
创建接口实例, 调用具体的网络请求
call 同步 / 异步网络请求
处理服务器返回的数据
Retrofit 网络通信八步骤
创建 Retrofit 实例
定义网络请求接口, 并为接口中的方法添加注解
通过动态代理生成网络请求对象
通过网络请求适配器将网络请求对象进行平台适配
通过网络请求执行器, 发送网络请求 (call)
通过数据解析器解析数据
通过会掉执行器, 切换线程
用户在主线程处理返回结果
代理
为其他对象提供一种代理, 用以控制对这个对象的访问
静态
动态在程序运行时创建的代理方式无侵入增强 jdk 动态代理 vs cglib
jdk 动态代理
只能为接口动态
InvocationHandler 必须要实现
invoke 的参数中获取参数
invoke 的返回值返回给使用者
newProxyInstance 中传入 InvocationHandler
总结:
运行期
InvocationHandler 接口和 Proxy 类
动态代理与静态代理的不同
源码
- serviceMethonCache // 缓存, 网络请求对象
- Factory callFactory // 默认 ok
- HttpUrl baseUrl
- List
- converterFactories
- List
- callAdapterFactories
- Executor callbackExecutor // 执行回调
- boolean validateEagerly // 是否立即解析接口中方法
- builder
- platform
单例获取不同平台 Android 平台中 MainthreadExecutor
converterFactory 数据解析 Converter, 将 response 通过 converterFactory 转换成对应的数据形式, GsonConverterFactory,FastJsonConverterFactory.
callAdapterFactory 经过 converter 转换的数据形势, 通过 calladapter 转换成其他数据方式. 如 rxjavaCallFactory 对应的 Observable.
RetrofitRetrofit 核心类, 对外提供接口. 通过 retrofit.create() 创建 retrofit 实例, 外观模式. 在 create() 方法中, 使用动态代理模式对请求的接口中方法进行封装 (ServiceMethod), 初始化 OkhttpCall.
ServiceMethod 核心处理类, 解析方法和注解, toRequest() 方法中生成 HttpRequest. 创建 responseConverter(将 response 流转换为 String 或实体), 创建 callAdapter
OkhttpCall 是对 okhttp3.Call 的封装调用.
来源: https://juejin.im/entry/5c8f8ecfe51d45346f1f9ca0