Retrofit对OkHttp3进行了封装,使更易于使用
Retroifit的创建过程
首先是入口,最普通的构建
Retrofit retrofit = new Retrofit.Builder().
addConverterFactory(GsonConverterFactory.create()).
baseUrl("你的地址").
build();
先看Buider()
public Builder() {
this(Platform.get());
}
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) {
}
try {
Class.forName("org.robovm.apple.foundation.NSObject");
return new IOS();
} catch (ClassNotFoundException ignored) {
}
return new Platform();
}
Platform会根据平台的不同获取不同的线程池
再看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();
}
// 用于存储对Call进行转化的对象
List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
// 用于存储转化数据的对象
List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);
return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
callbackExecutor, validateEagerly);
}
由源码可见,Retroifit要求地址必须不为空,创建时调用的baseUrl()会将地址封装成OkHttp3.HttpUrl 。会默认设置OkHttp3的OkHttpClient对象,当然如果需要也可以自己定制。紧接着维护了adapterFactories 和 converterFactories ,adapterFactories添加了一个元素platform.defaultCallAdapterFactory(callbackExecutor),而converterFactories里装的就是之前加入的GsonConverterFactory。把构建好的Retrofit返回去
这里先看platform.defaultCallAdapterFactory()