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<T> service)方法
  public <T> T create(final Class<T> 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值