Retroft2源码解析01-创建过程

Retroft通过建造者模式进行创建

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();  

build方法主要进行了初始化赋值

public Retrofit build() {
  //...
  okhttp3.Call.Factory callFactory = this.callFactory;
  //如果callFactory为null,则赋值为OkHttpClient
  if (callFactory == null) {
    callFactory = new OkHttpClient();
  }

  Executor callbackExecutor = this.callbackExecutor;
  //如果callbackExecutor为null,赋值为相应平台默认的Excutor,用作回调回UI线程
  if (callbackExecutor == null) {
    callbackExecutor = platform.defaultCallbackExecutor();
  }

  //将Call对象转化的合适执行类的List,比如RxJavaCallAdapterFactory
  List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
  //根据不同平台 添加默认CallAdapterFactory
  adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

  //转化数据对象的List,比如GsonConverterFactory
  List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);

  //传入参数,创建Retroft对象
  return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
      callbackExecutor, validateEagerly);
}

其中,这里的platform对象在Builder对象构造方法中初始化

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

来看Platform.get(),get方法想到于是一个工厂模式,而Platform显然是策略模式,根据不同的平台,执行不同的操作。

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

    static Platform get() {
    return PLATFORM;
    }

    private static Platform findPlatform() {
        try {
          Class.forName("android.os.Build");
          //如果是Android平台
          if (Build.VERSION.SDK_INT != 0) {
            return new Android();
          }
        } catch (ClassNotFoundException ignored) {
        }
        try {
          //如果是Java平台
          Class.forName("java.util.Optional");
          return new Java8();
        } catch (ClassNotFoundException ignored) {
        }
        try {
          //如果是IOS平台
          Class.forName("org.robovm.apple.foundation.NSObject");
          return new IOS();
        } catch (ClassNotFoundException ignored) {
        }
        return new Platform();
    }
}

猜你喜欢

转载自blog.csdn.net/ethanco/article/details/78449318
01-