步骤一: Retrofit初始化: Build模式
参数:
baseUrl : 请求域名
callFactory : 网络请求工厂类,用于生产Call
callbackExecutor : 请求回调,用于将结果回调到主线程,android平台上MainThreadExecutor
callAdapterFactories : List 网络请求适配器的工厂类
converterFactories : List 数据转化的工厂类
步骤二: Call的创建 : 动态代理模式
1. Retrofit.create 拿到动态代理对象
invoke方法中:
A. 获取ServiceMethod对象,Build模式
参数:
(以下参数是通过在初始化Retrofit时,用户自定义的,如没有定义,则使用默认)
callFactory :直接拿Retrofit中的网络请求工厂类
callAdapter :根据网络请求的返回值类型returnType和注解类型Annotation[],在Retrofit对象中获取对应的网络请求适配器 (使用工厂模式)
responseConverter : 根据网络请求的返回值类型returnType和注解类型Annotation[],在Retrofit对象中获取对应的数据转换器(与网络请求适配器的获得方式基本一样,工厂模式)
baseUrl : 网络请求地址
(以下参数都是通过解析网络请求方法获得)
relativeUrl : 网络请求相对地址
httpMethod : 网络请求方法 如 @GET @POST
headers :
contentType :
hasBody :
isFormEncoded :
isMultipart :
parameterHandlers
B. 获取OkHttpCall对象
参数:
ServiceMethod :步骤A获取的serviceMethod对象
Object[] args :网络请求接口中的请求参数
C. 通过ServiceMethod中获取的CallAdapter,调用adapt(OkHttpCall),返回Call
具体实现:
1.如没有指定CallAdapter,则用默认网络适配器工厂类 DefaultCallAdapterFactory 去get,返回CallAdapter。
2.使用CallAdapter调用adapt方法,在步骤1返回的CallAdapter中,adapt方法直接返回参数OkHttpCall
步骤三: 网络请求 Call.enqueue 或者 Call.execute : 装饰模式
因为Retrofit内部使用OkHttp去请求网络,所以按照OkHttp的网络请求步骤,如下(以异步请求为例):
A. 创建网络请求 okhttp3.Request : 通过ServiceMethod中的一系列参数,去创建request对象
B. 创建网络请求工具 okhttp3.Call : 通过ServiceMethod中的callFactory,其实就是okhttp3.OkHttpClient,调用newCall方法
C. 调用okhttp3.Call的 enqueue方法去做网络请求
D.
请求失败:调用callback参数的onFailure;
请求成功:在ServiceMethod中调用指定的responseConverter解析器,解析结果调用callback参数的onResponse。最后通过Retrofit中的callbackExecutor调度器即MainThreadExecutor,将callback从子线程调到主线程,返回给调用者
总结:
1.Retrofit源码中最重要的一步就是ServiceMethod的构建,ServiceMethod中几乎包含了整个流程中所需要的对象
- Retrofit的核心功能,网络请求完全使用OkHttp
- Retrofit使用了大量的设计模式,将http请求封装成java接口,符合Restful的设计风格,便于用户使用。可以理解为:是对OkHttp框架的深度封装
网友评论