retrofit源码解析--retrofit创建方法(builder、baseurl、converter...)

retrofit源码解析--retrofit创建方法(builder、baseurl、converter...)_第1张图片
Retrofit.png

创建一个retrofit:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("baseurl")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
Builder():
Builder(Platform platform) {
    this.platform = platform;
    // Add the built-in converter factory first. This prevents overriding its behavior but also
    // ensures correct behavior when using converters that consume all types.
    converterFactories.add(new BuiltInConverters());
  }

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

  Builder(Retrofit retrofit) {
    platform = Platform.get();
    callFactory = retrofit.callFactory;
    baseUrl = retrofit.baseUrl;
    converterFactories.addAll(retrofit.converterFactories);
    adapterFactories.addAll(retrofit.adapterFactories);
    // Remove the default, platform-aware call adapter added by build().
    adapterFactories.remove(adapterFactories.size() - 1);
    callbackExecutor = retrofit.callbackExecutor;
    validateEagerly = retrofit.validateEagerly;
  }

3个Builder方法分别是一个空参、传入一个Platform、和传入一个Retrofit,日常使用中通常使用空参这个this(Platform.get())设置retrofit使用平台:

class Platform {
  private static final Platform PLATFORM = findPlatform();

  static Platform get() {
    return PLATFORM;
  }

  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();
  }
  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);
      }
    }
  }

通过反射加载android.os.Build,获得一个Android()对象。
默认使用android平台,同时看到还支持java8平台
Android:
其中defaultCallbackExecutor()返回一个默认的回调执行器并且是主线程的(Looper.getMainLooper()),这里就看出Retrofit与主线程的绑定。

总结

  • 指定平台,关联主线程
baseurl(String baseUrl):
public Builder baseUrl(String baseUrl) {
    checkNotNull(baseUrl, "baseUrl == null");
    HttpUrl httpUrl = HttpUrl.parse(baseUrl);
    if (httpUrl == null) {
      throw new IllegalArgumentException("Illegal URL: " + baseUrl);
    }
    return baseUrl(httpUrl);
  }
  • 先判断baseUrl是否为空
  • 将String类型的baseUrl转化为HttpUrl类型
public Builder baseUrl(HttpUrl baseUrl) {
    checkNotNull(baseUrl, "baseUrl == null");
    List pathSegments = baseUrl.pathSegments();
    if (!"".equals(pathSegments.get(pathSegments.size() - 1))) {
      throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);
    }
    this.baseUrl = baseUrl;
    return this;
  }
  • 判断是否为空
  • pathSegments将baseUrl转换并判断最后一行必须是以斜杠为结尾
  • 返回Retrofit用于接下来的构造

总结

  • 将String类型的url转换成适合okhttp访问的HttpUrl
addConverterFactory(GsonConverterFactory.create()):
public Builder addConverterFactory(Converter.Factory factory) {
    converterFactories.add(checkNotNull(factory, "factory == null"));
    return this;
}
  • 添加转换器converterFactories
public final class GsonConverterFactory extends Converter.Factory {
public static GsonConverterFactory create() {
  return create(new Gson());
}

@SuppressWarnings("ConstantConditions") // Guarding public API nullability.
public static GsonConverterFactory create(Gson gson) {
  if (gson == null) throw new NullPointerException("gson == null");
  return new GsonConverterFactory(gson);
}
  • 创建gson对象
addCallAdapterFactory(RxJava2CallAdapterFactory.create()):
 public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
    adapterFactories.add(checkNotNull(factory, "factory == null"));
    return this;
  }
  • 添加网络适配器
build():
public Retrofit build() {
   if (baseUrl == null) {
     throw new IllegalStateException("Base URL required.");
   }

   okhttp3.Call.Factory callFactory = this.callFactory;
   if (callFactory == null) {
     callFactory = new OkHttpClient();
   }

   Executor callbackExecutor = this.callbackExecutor;
   if (callbackExecutor == null) {
     callbackExecutor = platform.defaultCallbackExecutor();
   }

   // Make a defensive copy of the adapters and add the default Call adapter.
   List adapterFactories = new ArrayList<>(this.adapterFactories);
   adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

   // Make a defensive copy of the converters.
   List converterFactories = new ArrayList<>(this.converterFactories);

   return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
       callbackExecutor, validateEagerly);
 }
}

总结
对成员变量判断并赋值,最终返回Retrofit实例

你可能感兴趣的:(retrofit源码解析--retrofit创建方法(builder、baseurl、converter...))