自己学习总结,仅供自己参考,如有不对欢迎指正
官方文档:https://square.github.io/retrofit/
A type-safe HTTP client for Android and Java
Retrofit 是一个在编译期就会将类型错误检查出来的,用来做Http请求的客户端工具
1.Retrofit的核心是动态代理:
在源码中的体现:
public <T> T create(final Class<T> 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 Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
//如果调用的方法是Object本身就有的方法,就直接返回。
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
//用来做跨平台兼容的,比如java8 Android24等
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
}
});
}
Proxy.newProxyInstance通过这个方法会在运行时,生成传进来service对应的类,类里面实现了service所有的方法。方法的实际调用都是通过反射的方式。
InvocationHandler中的invoke方法是主要的实现,他的三个参数
- proxy具体代理对象,就是自己
- method 具体的service的方法
- args 方法对应的参数
loadServiceMethod方法带缓存的加载,如果有缓存获取缓存,如果没有创建一个新的SeviceMethod
SeviceMethod作用:就是解读service中的方法,比如参数、方法名、请求方式等等
invoke(args != null ? args : emptyArgs);主要做的工作:
- 创建了一个OkHttpCall ,实际上每一个 OkHttpCall 都对应于一个请求,它主要完成最基础的网络请求
- 通过CallAdapter将call进行对应转换,比如将一个call转换成RxJava中的Observable
2.CallAdapter
主要作用:对call进行包装转换,比如将一个call转换成RxJava中的Observable
3.Converter
主要作用:转换(解析)服务器返回的数据、接口方法的注解参数等,包括对接口的加密、编码格式的转换等。
网友评论