返回

Retrofit源码赏析七 ——RequestFactory

Android

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 类来创建请求。