美文网首页
Retrofit 源码分析3-工厂模式在 Retrofit 里的

Retrofit 源码分析3-工厂模式在 Retrofit 里的

作者: jkwen | 来源:发表于2021-06-11 08:06 被阅读0次

GsonConverterFactory 继承自 Converter.Factory 是用 Gson 来表示 JSON 的,为啥用 Gson 呢?类注释上说,Gson 对类型支持很灵活,也就是说能支持日常开发的所有类型吧。

Converter 是个泛型接口,定义了一个方法,convert 用于数据转换。其内部有个抽象类,Factory,是作为其他具体转换器工厂的一个抽象基类,例如这里的 GsonConverterFactory。

实际上这里采用了工厂模式,Converter 作为抽象产品类,定义了产品的功能。Factory 则是抽象工厂类,定义了工厂如何生产产品。

GsonConverterFactory 的对象创建如下,

public static GsonConverterFactory create() {
    //将 Gson 对象作为入参传入,后续创建 Converter 对象时需要用到它
    return create(new Gson());
}

Gson 转换器工厂主要生产两种转换器,一种是未知类型向 RequestBody 的转换,一种是 ResponseBody 向未知类型的转换。通常未知类型是我们定义的 Java Bean。

GsonRequestBodyConverter

final class GsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private static final MediaType MEDIA_TYPE = MediaType.get("application/json; charset=UTF-8");
    private static final Charset UTF_8 = Charset.forName("UTF-8");
    @Override public RequestBody convert(T value) throws IOException {
        Buffer buffer = new Buffer();
        Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
        JsonWriter jsonWriter = gson.newJsonWriter(writer);
        adapter.write(jsonWriter, value);
        jsonWriter.close();
        return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
    }
}

GsonResponseBodyConverter

final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    @Override public T convert(ResponseBody value) throws IOException {
        JsonReader jsonReader = gson.newJsonReader(value.charStream());
        try{
            T result = adapter.read(jsonReader);
            if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
                throw new JsonIOException("JSON document was not fully consumed.");
            }
            return result;
        } finally{
            value.close();
        }
    }
}

所以总的来看,GsonConverter 就是利用 Gson 来帮我们完成请求过程中与标准数据体的转换,好让我们提高效率。另外要想使用这个转换器是要添加依赖的,

implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

同样的原理,可以对 RxJava2CallAdapterFactory 进行分析。同转换器一样,也要另外添加依赖,

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'

这些网络请求的前提条件准备好之后,接下去就可以做一次网络请求的分析了。

相关文章

网友评论

      本文标题:Retrofit 源码分析3-工厂模式在 Retrofit 里的

      本文链接:https://www.haomeiwen.com/subject/uhtseltx.html