Retrofit源码解析
OKHTTP的基本认识
- 创建OkHttpClient,OkHttpClient负责实际请求的发送,并且可以对他配置超时时间、网络代理、缓存等。
- 创建RequestHeader和RequestBody。
- 创建Request。
- 由OkHttpClient发送request获取response。
retrofit 基本使用
- 准备一个接口serverApi,里面写好各种实现方法,加好GET/POST注解。
- 创建Retrofit对象。
- 用retrofit调用create方法创建serverApi的实现类。
- 通过调用实现类的各种方法进行接口调用。
retrofit的思想
- 接口隔离。
- 方便调用,免除了层层创建对象的麻烦。
- 复用OkHttpClient。
- 方便json解析出入参数。
- 方便用rxjava进行函数式编程。
- 统一了BaseUrl。
retrofit的不足
- 有点死板,不支持返回中无responseBody的情况。
- 不支持WebSocket,而Okhttp实际上是支持的。
retrofit原理解析
create(final Class<T> service)方法
public <T> T create(final Class<T> service) {
//对传入的service进行检查,首先必须是接口,并且不能继承其他接口。
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
private final Object[] emptyArgs = new Object[0];
@Override public @Nullable 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);
}
return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
}
});
}
这一眼看上去就是个动态代理嘛。。。如果对okhttp有点了解的话,就知道代理生成的应该是ok的client对象了。重点就在于之前的代码。
未完待续。。。