Retrofit源码赏析七 ——RequestFactory
2023-12-26 16:18:04
RequestFactory 简介
RequestFactory 是 Retrofit 中用于创建请求的工厂类,它负责将注解信息和参数信息转换为 OkHttp 的 Request 对象。RequestFactory 类位于 retrofit2.converter.scalars 包中,它是一个抽象类,提供了创建 Request 对象的通用方法。
RequestFactory 的结构
RequestFactory 类只有一个抽象方法 create(CallAdapter.Factory),该方法负责创建 CallAdapter.Factory 实例。CallAdapter.Factory 是一个接口,用于将 Retrofit 方法的返回值转换为 Call 对象。
RequestFactory 类还提供了几个静态方法,用于创建常用的 CallAdapter.Factory 实例,包括:
- createScalarFactory():创建一个将标量值转换为 Call 对象的 CallAdapter.Factory 实例。
- createGsonFactory():创建一个将 Gson 对象转换为 Call 对象的 CallAdapter.Factory 实例。
- createJacksonFactory():创建一个将 Jackson 对象转换为 Call 对象的 CallAdapter.Factory 实例。
RequestFactory 的实现
RequestFactory 类的实现非常简单,它只实现了 create(CallAdapter.Factory) 方法。该方法首先检查传入的 CallAdapter.Factory 实例是否为 null,如果不是,则直接返回该实例。否则,它将根据 Retrofit 实例的配置创建一个新的 CallAdapter.Factory 实例。
Retrofit 实例的配置包括以下几个方面:
- baseUrl:基准 URL。
- converterFactories:转换器工厂列表。
- callAdapterFactories:调用适配器工厂列表。
- executor:执行器。
- client:客户端。
RequestFactory 类根据这些配置创建一个新的 CallAdapter.Factory 实例。该实例将使用 Retrofit 实例的 baseUrl、converterFactories 和 callAdapterFactories 来创建 Request 对象。
RequestFactory 的使用
RequestFactory 类通常由 Retrofit 实例内部使用,开发人员很少直接使用它。但是,在某些情况下,开发人员可能需要直接使用 RequestFactory 类来创建请求。例如,当开发人员需要创建一个自定义的 CallAdapter.Factory 实例时,就需要使用 RequestFactory 类。
以下是一个使用 RequestFactory 类创建自定义 CallAdapter.Factory 实例的示例:
import retrofit2.CallAdapter;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
public class MyCallAdapterFactory implements CallAdapter.Factory {
@Override
public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
if (returnType == String.class) {
return new MyCallAdapter();
}
return null;
}
private static class MyCallAdapter implements CallAdapter<String, String> {
@Override
public Type responseType() {
return String.class;
}
@Override
public Object adapt(Call<String> call) {
try {
return call.execute().body();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.example.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(new MyCallAdapterFactory())
.build();
MyService service = retrofit.create(MyService.class);
Call<String> call = service.getString();
String response = call.execute().body();
System.out.println(response);
}
}
在这个示例中,我们创建了一个自定义的 CallAdapter.Factory 实例 MyCallAdapterFactory。该工厂将 String 类型的返回值转换为 Call 对象。然后,我们将这个工厂添加到 Retrofit 实例中。最后,我们使用 Retrofit 实例创建了一个 MyService 接口的代理对象,并使用该代理对象来发送请求。
总结
RequestFactory 类是 Retrofit 中用于创建请求的工厂类,它负责将注解信息和参数信息转换为 OkHttp 的 Request 对象。RequestFactory 类通常由 Retrofit 实例内部使用,开发人员很少直接使用它。但是,在某些情况下,开发人员可能需要直接使用 RequestFactory 类来创建请求。