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'
这些网络请求的前提条件准备好之后,接下去就可以做一次网络请求的分析了。
网友评论