美文网首页
Retrofit原理简析

Retrofit原理简析

作者: 浩仔_Boy | 来源:发表于2020-12-08 18:05 被阅读0次

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

    官方文档: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

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

    相关文章

      网友评论

          本文标题:Retrofit原理简析

          本文链接:https://www.haomeiwen.com/subject/dwrqgktx.html