Retrofit

一种类型安全的http连接工具

对okhttp的封装,更易用,但伴随着功能的收窄

源码流程

  1. retrofit.creat()

    #Retrofit.java#
    public <T> T create(final Class<T> service) {
        validateServiceInterface(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);//检查方法是object中的方法,不作处理,直接运行
                    }
                    args = args != null ? args : emptyArgs;
                    return platform.isDefaultMethod(method)
                        ? platform.invokeDefaultMethod(method, service, proxy, args)//检查方法是java8默认方法不作处理直接运行
                        : loadServiceMethod(method).invoke(args);//进入下一步
                  }
                });
      }
    

    动态代理:

    动态:运行时创建

    代理:对方法做统一处理

  2. parseAnnotattions位于ServiceMethod.Java:解析方法的注解参数等

  3. invoke位于ServiceMethod.Java:创建okhttpCall,做网络交互

  4. responseConvert位于OkHttpCall:如果有addConvertFactory(),会对response’Body进行指定的转换,比如转成json

  5. 返回的call通过callAdapter转化把返回结果转为指定格式,rxJava或抛到主线程