public Retrofit build() {
//如果 baseUrl 为空,那么抛出异常(Url都为空了,那还访问啥)
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
//这里的 callFactory,就是我们上面示例中的自定义的 okhttp client,
//如果我们配置自定义的 client 的话,那么这里直接 new 一个默认的 client
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}
//这里则配置执行后的回调,我的示例中并没有配置
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
//这里跟 Builder 的时候有关,如果是 Android 环境下,那么会返回一个默认的 CallbackExecutor
callbackExecutor = platform.defaultCallbackExecutor();
}
// Make a defensive copy of the adapters and add the default Call adapter.
//这里就是我们配置的适配器,在示例中,我添加了RxJava 的相关适配器
List callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
//添加完我们添加的适配器 后会自动添加必须的适配器,这里的设置的回调便是上面的 callbackExecutor
callAdapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
// Make a defensive copy of the converters.
//这里就是添加变流器的流程了,类似于适配器的添加,我们这里添加了 Gson 的相关转换器
List converterFactories =
new ArrayList<>(1 + this.converterFactories.size());
// 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());
converterFactories.addAll(this.converterFactories);
//这里依据我们配置的各种参数来生成一个 retrofit 的实例
return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
}
/**
* Creates call adapters for that uses the same thread for both I/O and application-level
* callbacks. For synchronous calls this is the application thread making the request; for
* asynchronous calls this is a thread provided by OkHttp's dispatcher.
*/
final class DefaultCallAdapterFactory extends CallAdapter.Factory {
static final CallAdapter.Factory INSTANCE = new DefaultCallAdapterFactory();
@Override
public CallAdapter get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
//如果我们 ApiService 接口中请求中返回的类型不是 Call 对象,那么就返回 null
if (getRawType(returnType) != Call.class) {
return null;
}
//1
final Type responseType = Utils.getCallResponseType(returnType);
return new CallAdapter
static Type getCallResponseType(Type returnType) {
// 这里对返回类型做了判断,如果不是 Call 或者 Call,那么就抛出异常。
if (!(returnType instanceof ParameterizedType)) {
throw new IllegalArgumentException(
"Call return type must be parameterized as Call or Call");
}
// 返回获取到的返回值类型,以便后续 Conveeter 做类型转换
return getParameterUpperBound(0, (ParameterizedType) returnType);
}
static final class VoidResponseBodyConverter implements Converter {
static final VoidResponseBodyConverter INSTANCE = new VoidResponseBodyConverter();
@Override public Void convert(ResponseBody value) {
value.close();
return null;
}
}
static final class RequestBodyConverter implements Converter {
static final RequestBodyConverter INSTANCE = new RequestBodyConverter();
@Override public RequestBody convert(RequestBody value) {
return value;
}
}
static final class StreamingResponseBodyConverter
implements Converter {
static final StreamingResponseBodyConverter INSTANCE = new StreamingResponseBodyConverter();
@Override public ResponseBody convert(ResponseBody value) {
return value;
}
}
static final class BufferingResponseBodyConverter
implements Converter {
static final BufferingResponseBodyConverter INSTANCE = new BufferingResponseBodyConverter();
@Override public ResponseBody convert(ResponseBody value) throws IOException {
try {
// Buffer the entire body to avoid future I/O.
return Utils.buffer(value);
} finally {
value.close();
}
}
}
static final class ToStringConverter implements Converter {
static final ToStringConverter INSTANCE = new ToStringConverter();
@Override public String convert(Object value) {
return value.toString();
}
}
This article is from an interview with Zuhaib Siddique, a production engineer at HipChat, makers of group chat and IM for teams.
HipChat started in an unusual space, one you might not