Retrofit 源码学习分析(一)

本文章是基于retrofit 2.4.0 分析,我们一起来分析学习一下。

  • 首先,我们写一个基本网络请求
Retrofit mRetrofit = new Retrofit.Builder()
        .baseUrl(URL).build();

接下来,我们一步步分析。

 public Builder() {
      this(Platform.get());
    }

这里我们先看一下Platform.get()。最终调用了这里

private static Platform findPlatform() {
  try {
    Class.forName("android.os.Build");
    if (Build.VERSION.SDK_INT != 0) {
      return new Android();
    }
  } catch (ClassNotFoundException ignored) {
  }
  try {
    Class.forName("java.util.Optional");
    return new Java8();
  } catch (ClassNotFoundException ignored) {
  }
  return new Platform();
}

不出意外android手机是带有os.build这个类的。这里生成了一个android class对象。

  static class Android extends Platform {
    @Override public Executor defaultCallbackExecutor() {
      return new MainThreadExecutor();
    }

    @Override CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
      if (callbackExecutor == null) throw new AssertionError();
      return new ExecutorCallAdapterFactory(callbackExecutor);
    }

    static class MainThreadExecutor implements Executor {
      private final Handler handler = new Handler(Looper.getMainLooper());

      @Override public void execute(Runnable r) {
        handler.post(r);
      }
    }
  }

然后Retrofit.Builder()基本就完成了。我们来看一下.baseUrl(URL)。

接着,我们看一下httpurl对象的生成过程。以此我们看到源码会调用:

  public static @Nullable HttpUrl parse(String url) {
    try {
      return get(url);
    } catch (IllegalArgumentException ignored) {
      return null;
    }
  }
  public static HttpUrl get(String url) {
    return new Builder().parse(null, url).build();
  }
public Builder() {
      encodedPathSegments.add(""); // The default path is '/' which needs a trailing space.
    }

然后调用parse方法,这里初始化了host,port,encodedUsername,encodedPassword等参数。(这里实在是比较繁琐,有兴趣的同学可以自己看一下)最终调用build方法,生成了一个httpurl对象。

然后我们回到这里

 return baseUrl(httpUrl);

接下来,就是一些非空判断,结尾路径判断,然后赋值baseUrl。

然后我们回到.build方法。

首先一个非空判断,当我们没有使用.client方法时,callbackExecutor此时为null。这时这里会生成一个默认的OkhttpClient。

同理callbackExecutor也是生成一个默认的Executor。(此时由上面生成的是android 对象 这里是调用andorid 对象里的方法,最终这里生成了MainThreadExecutor 线程调度器)。

callAdapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));这里会把转换器加入工厂。

然后是生成解析器工厂。

最终调用,

  return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
          unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);

生成一个最简单的retrofit。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值