在Retrofit中, 不管是发送数据或是接收数据, 最基本都是通过OKHttp的RequestBody和ResponseBody来实现,但是通常为了方便,我们在定制协议的时候,不会直接使用原始的RequestBody或是ResponseBody,因此,在Retrofit中,我们就需要对它进行转换。
在Retrofit的类的定义中,有个converterFactories的List,我们可以在build时添加多个,但要注意的是,添加的顺序是有影响的。
private final List<Converter.Factory> converterFactories;
按照retrofit的逻辑,是从前往后进行匹配,如果匹配上,就忽略后面的,直接使用。
int start = converterFactories.indexOf(skipPast) + 1;
for (int i = start, count = converterFactories.size(); i < count; i++) {
Converter.Factory factory = converterFactories.get(i);
Converter<?, RequestBody> converter =
factory.requestBodyConverter(type, parameterAnnotations, methodAnnotations, this);
if (converter != null) {
//noinspection unchecked
return (Converter<T, RequestBody>) converter;
}
}
从上面的源码中可以看到,当factory.requestBodyConverter返回空时,表示没有匹配上,可使用下一个factory.
因此,当我们自定义converter的时候,需要进行条件判断,符合我们一定规则的才能使用。
Type
我们以创建protobuff为例。
public final class ProtoConverterFactory extends Converter.Factory {
public static ProtoConverterFactory create() {
return new ProtoConverterFactory();
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
//进行条件判断,如果传进来的Type不是