基于 Retrofit 2.0.1 版

源码结构

入口 Retrofit 类:

Retrofit 类是这个库的入口,整个库所支持的特性都可以在这里看到。想看看它的 Builder 几个主要方法:

  • create(final Class service):这里是整个库的入口。传入一个接口,Retrofit 通过动态代理,最终将接口转为一个 Call 并返回给使用者。
  • callbackExecutor(Executor executor):配置回调用的 Executor,Executor 可以对回调进行调度。
  • addConverterFactory(Converter.Factory factory),addCallAdapterFactory(CallAdapter.Factory factory):配置对应的 Converter 或 CallAdapter,这个会在核心接口里面说。

几个核心接口和类:

  • Call 接口:表示一次 http 请求,包含 request 和 response。可以通过 execute 方法进行异步请求,enqueue 方法进行同步请求,cancle 方法取消请求和回调。
  • OkHttpCall 类:Call 接口的 OKHttp 实现版。

  • CallAdapter 接口:提供了 Call 到其他类型数据的转换,可以通过 Retrofit.Builder.addCallAdapterFactory() 进行配。比如 adapter-rxjava 的实现,就是通过 CallAdapter 接口将 Call 转换为 Observable 的。
  • DefaultCallAdapterFactory 类:TODO
  • ExecutorCallAdapterFactory 类:如果在 Retrofit 中指定 callbackExecutor 的话,Retrofit 会默认添加添加一个 ExecutorCallAdapterFactory 到 Retrofit 中,将 Call 代理到 ExecutorCallbackCall 中,从而实现 Executor 功能。

  • Converter 接口:实现数据序列化的接口,包含 request 时,model 到 Http 数据的转行和 response 是,Http 数据到 model 的转换。
  • BuiltInConverters 类: Retrofit 内部的一个 Converter 实现类,包含一些默认的实现,eg:StringConverter,VoidResponseBodyConverter,StreamingResponseBodyConverter,BufferingResponseBodyConverter。

  • ServiceMethod 类:把每次对 Retrofit 传入接口的方法调用定义为 invokeMethod ,ServiceMethod 主要作用就是把 invokeMethod 转换成一次 Http Request,在这里的实现是转成 OKhttp 的 Request,ServiceMethod 包含 invokeMethod 必要信息:比如 bashUrl,请求的 header,请求的参数,注解等等。

可以说 Retrofit 的主要逻辑都在 ServiceMethod 类中,包含所有注解的解析,参数的获取,Converter 和 CallAdapter 的检索配置等等。

其他的类:

  • Callback 接口:异步请求时候用的回调接口
  • RequestBuilder 类:可以用来创建 OkHttp Request 的 Builder
  • Response 类:表示一个 Http response
  • ParameterHandler 抽象类:参数添加抽象类,通过对 RequestBuilder 的封装,把 Http 中传输的添加划分得更加详细了。
  • Platform 类:针对不同平台进行兼容处理的类。
  • packeage Http :Http 包下是所有 Retrofit 支持的注解
  • Utils 类:工具类

原理

Retrofit 使用的关键技术就是 Java 的动态代理,对接口中每个方法的调用进行代理,从而实现了最终只要写接口和注解就可以进行 Http 请求的效果。这个主要的流程可以直接去看 Retrofit.java 的 crate() 函数,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public <T> T create(final Class<T> service) {
//检查接口合法性
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
//Java 动态代理 method 的调用
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service},
new InvocationHandler() {
private final Platform platform = Platform.get();

@Override
public Object invoke(Object proxy, Method method, 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);
}
//将 method 转为 ServiceMethod
ServiceMethod serviceMethod = loadServiceMethod(method);
//根据 ServiceMethod 生成对应的 OkHttpCall
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
//根据 CallAdapter 对 Call 进行转换
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}