Retrofit源码解析一——从create方法切入

Retrofit源码解析

OKHTTP的基本认识

  1. 创建OkHttpClient,OkHttpClient负责实际请求的发送,并且可以对他配置超时时间、网络代理、缓存等。
  2. 创建RequestHeader和RequestBody。
  3. 创建Request。
  4. 由OkHttpClient发送request获取response。

retrofit 基本使用

  1. 准备一个接口serverApi,里面写好各种实现方法,加好GET/POST注解。
  2. 创建Retrofit对象。
  3. 用retrofit调用create方法创建serverApi的实现类。
  4. 通过调用实现类的各种方法进行接口调用。

retrofit的思想

  1. 接口隔离。
  2. 方便调用,免除了层层创建对象的麻烦。
  3. 复用OkHttpClient。
  4. 方便json解析出入参数。
  5. 方便用rxjava进行函数式编程。
  6. 统一了BaseUrl。

retrofit的不足

  1. 有点死板,不支持返回中无responseBody的情况。
  2. 不支持WebSocket,而Okhttp实际上是支持的。

retrofit原理解析

create(final Class service)方法

  public  T create(final Class 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对象了。重点就在于之前的代码。

未完待续。。。

转载于:https://my.oschina.net/JiangTun/blog/3100893

你可能感兴趣的:(Retrofit源码解析一——从create方法切入)