callback.onResponse(ExecutorCallbackCall.this, response);
}
});
}
@Override public void onFailure(Call call, final Throwable t) {
callbackExecutor.execute(() -> callback.onFailure(ExecutorCallbackCall.this, t));
}
});
}
// …
}
可以看到,这里实际上只是对 Callback 进行了包装,通过传递的 Executor 进行回调,从而对 callbackExecutor
进行支持。
Converter
接着我们看看 Converter
类,它是一个接口,用于将类型 F 的数据转换为类型 T:
public interface Converter<F, T> {
@Nullable T convert(F value) throws IOException;
// …
}
接着我们看看 createResponseConverter
是如何对它进行创建的:
private static Converter<ResponseBody, ResponseT> createResponseConverter(
Retrofit retrofit, Method method, Type responseType) {
Annotation[] annotations = method.getAnnotations();
try {
return retrofit.responseBodyConverter(responseType, annotations);
} catch (RuntimeException e) { // Wide exception range because factories are user code.
throw methodError(method, e, “Unable to create converter for %s”, responseType);
}
}
转调到了 retrofit.responseBodyConverter
:
public Converter<ResponseBody, T> responseBodyConverter(Type type, Annotation[] annotations) {
return nextResponseBodyConverter(null, type, annotations);
}
转调到了 nextResponseBodyConverter
:
public Converter<ResponseBody, T> nextResponseBodyConverter(
@Nullable Converter.Factory skipPast, Type type, Annotation[] annotations) {
Objects.requireNonNull(type, “type == null”);
Objects.requireNonNull(annotations, “annotations == null”);
int start = converterFactories.indexOf(skipPast) + 1;
for (int i = start, count = converterFactories.size(); i < count; i++) {
Converter<ResponseBody, ?> converter =
converterFactories.get(i).responseBodyConverter(type, annotations, this);
if (converter != null) {
//noinspection unchecked
return (Converter<ResponseBody, T>) converter;
}
}
// 没有找到对应的 ConverterFactory 进行处理,抛出异常
}
可以看到,这里与 CallAdapter
工厂类似,遍历创建 Retrofit 时传入的 Converter.Factory
列表,尝试进行创建,如果没有工厂能对其进行处理,抛出异常。(前面 Factory 的优先级更高)
Retrofit
中内置了两个 Converter.Factory
,分别是 BuiltInConverters
以及 OptionalConverterFactory
。
其中 BuiltInConverters
的优先级比所有自定义工厂要高,以避免其他工厂覆盖它的方法,而 OptionalConverterFactory
的优先级比所有自定义工厂的优先级更低。
BuiltInConverters
中实现了多个转换器如将 ResponseBody
转换为 Void 或 Unit,将 Object 转换为 String 等。
OptionalConverterFactory
是通过 platform 获取到的 defaultConverterFactories
,它是为了支持 Java 8 的 Optional 而实现的,Optional 是 Java 8 引入的用来解决空指针异常的类。
ServiceMethod
接着我们看看之前创建的 ServiceMethod
类,它是一个抽象类,需要子类对 invoke 方法进行实现。
abstract class ServiceMethod {
abstract @Nullable T invoke(Object[] args);
}
它的子类就是前面提到的 HttpServiceMethod
HttpServiceMethod
abstract class HttpServiceMethod<ResponseT, ReturnT> extends ServiceMethod {
@Override final @Nullable ReturnT invoke(Object[] args) {
Call call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);
return adapt(call, args);
}
protected abstract @Nullable ReturnT adapt(Call call, Object[] args);
}
HttpServiceMethod
的 invoke 方法非常简单,它构造了一个 OkHttpCall
,然后通过 adapt 这个虚函数来实现对 Call 的转换。它的子类只需要实现 adapt 从而对 Call 进行转换即可。
它共有三个子类,