
简介
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口层的封装(请求参数、Header、Url 等信息)。
流程

源码分析
- 创建Retrofit实例
 - 创建 网络请求接口实例 并 配置网络请求参数
 - 发送网络请求(封装了 数据转换、线程切换的操作)
 - 处理服务器返回的数据
 
创建Retrofit实例
1  | Retrofit retrofit = new Retrofit.Builder()  | 
成功建立一个Retrofit对象的标准:配置好Retrofit类里的成员变量,即配置好:
- serviceMethod:包含所有网络请求信息的对象
 - baseUrl:网络请求的url地址
 - callFactory:网络请求工厂
 - adapterFactories:网络请求适配器工厂的集合
 - converterFactories:数据转换器工厂的集合
 - callbackExecutor:回调方法执行器
 
serviceMethod
将请求的注解信息封装成serviceMethod对象
baseUrl
1  | public Builder baseUrl(String baseUrl) {  | 
把String类型的url参数转化为适合OKhttp的HttpUrl类型,检测最后一个碎片来检查URL参数是不是以”/“结尾,不是就抛出异常。
callFactory
网络请求工厂,默认为OkHttpClient。
adapterFactories
CallAdapterFactory:该Factory生产的是CallAdapter,那么CallAdapter又是什么呢?将默认的网络请求执行器(OkHttpCall)转换成适合被不同平台来调用的网络请求执行器形式。
- Call在Retrofit里默认是OkHttpCall
 - 在Retrofit中提供了四种CallAdapterFactory: ExecutorCallAdapterFactory(默认)、GuavaCallAdapterFactory、Java8CallAdapterFactory、RxJavaCallAdapterFactory
 
converterFactories
1  | public final class GsonConverterFactory extends Converter.Factory {  | 
创建一个含有Gson对象实例的GsonConverterFactory并放入到数据转换器工厂converterFactories里
- 即Retrofit默认使用Gson进行解析
 - 若使用其他解析方式(如Json、XML或Protocobuf),也可通过自定义数据解析器来实现(必须继承 Converter.Factory)
 
callbackExecutor
1  | static class Android extends Platform {  | 
默认回调方法执行器作用是:切换线程(子线程 - 主线程)
调用retrofit的create方法
使用动态代理根据接口创建实例对象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
    new InvocationHandler() {
      private final Platform platform = Platform.get();
       public Object invoke(Object proxy, Method method, @Nullable Object[] args)
          throws Throwable {
        // If the method is a method from Object then defer to normal invocation.
        if (method.getDeclaringClass() == Object.class) {
          return method.invoke(this, args);
        }
        if (platform.isDefaultMethod(method)) {
          return platform.invokeDefaultMethod(method, service, proxy, args);
        }
        ServiceMethod<Object, Object> serviceMethod =
            (ServiceMethod<Object, Object>) loadServiceMethod(method);
        OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
        return serviceMethod.callAdapter.adapt(okHttpCall);
      }
    });
根据第一步配置好的ServiceMethod对象和输入的请求参数创建okHttpCall对象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<--OkHttpCall类 -->
public class OkHttpCall {
    private final ServiceMethod<T> serviceMethod; // 含有所有网络请求参数信息的对象  
    private final Object[] args; // 网络请求接口的参数 
    private okhttp3.Call rawCall; //实际进行网络访问的类  
    private Throwable creationFailure; //几个状态标志位  
    private boolean executed;  
    private volatile boolean canceled;  
  
<--OkHttpCall构造函数 -->
  public OkHttpCall(ServiceMethod<T> serviceMethod, Object[] args) {  
    // 传入了配置好的ServiceMethod对象和输入的请求参数
    this.serviceMethod = serviceMethod;  
    this.args = args;  
}
将第二步创建的OkHttpCall对象传给第一步创建的serviceMethod对象中对应的网络请求适配器工厂的adapt()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<--  adapt()详解-->
public <R> Call<R> adapt(Call<R> call) {
        return new ExecutorCallbackCall<>(callbackExecutor, call);  
      }
   ExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) {
      this.delegate = delegate; 
      // 把上面创建并配置好参数的OkhttpCall对象交给静态代理delegate
      // 静态代理和动态代理都属于代理模式
     // 静态代理作用:代理执行被代理者的方法,且可在要执行的方法前后加入自己的动作,进行对系统功能的拓展
      
      this.callbackExecutor = callbackExecutor;
      // 传入上面定义的回调方法执行器
      // 用于进行线程切换   
    }
返回对象类型:Android默认的是Call<>;若设置了RxJavaCallAdapterFactory,返回的则是Observable<>
请求
- 同步请求 execute
 - 异步请求 enqueue
 
总结
Retrofit 本质上是一个 RESTful 的HTTP 网络请求框架的封装,即通过 大量的设计模式 封装了 OkHttp ,使得简洁易用。具体过程如下:
- Retrofit 将 Http请求 抽象 成 Java接口
 - 在接口里用 注解 描述和配置 网络请求参数
 - 用动态代理 的方式,动态将网络请求接口的注解 解析 成HTTP请求
 - 最后执行HTTP请求
