Retrofit原理简析

2020-12-08  本文已影响0人  浩仔_Boy

自己学习总结,仅供自己参考,如有不对欢迎指正

官方文档: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方法是主要的实现,他的三个参数

loadServiceMethod方法带缓存的加载,如果有缓存获取缓存,如果没有创建一个新的SeviceMethod
SeviceMethod作用:就是解读service中的方法,比如参数、方法名、请求方式等等

invoke(args != null ? args : emptyArgs);主要做的工作:

2.CallAdapter

主要作用:对call进行包装转换,比如将一个call转换成RxJava中的Observable

3.Converter

主要作用:转换(解析)服务器返回的数据、接口方法的注解参数等,包括对接口的加密、编码格式的转换等。

上一篇 下一篇

猜你喜欢

热点阅读