Retrofit选择ResponseConverter的流程如下:
HttpServiceMethod
Retrofit
parseAnnotations
createResponseConverter
responseBodyConverter
nextResponseBodyConverter
retrun ResponseConverter
HttpServiceMethod
Retrofit
在HttpServiceMethod的parseAnnotations中会创建处理返回数据的Converter(如果不太清楚流程的话要可以看看前面的一篇文章:Retrofit请求流程 ):
Converter< ResponseBody, ResponseT> responseConverter =
createResponseConverter ( retrofit, method, responseType) ;
private static < ResponseT> Converter< ResponseBody, ResponseT> createResponseConverter (
Retrofit retrofit, Method method, Type responseType) {
Annotation[ ] annotations = method. getAnnotations ( ) ;
try {
return retrofit. responseBodyConverter ( responseType, annotations) ;
} catch ( RuntimeException e) { // Wide exception range because factories are user code.
throw methodError ( method, e, "Unable to create converter for %s" , responseType) ;
}
}
retrofit会把返回类型和方法上的注解回调给用户,由用户去匹配Converter
public < T> Converter< ResponseBody, T> responseBodyConverter ( Type type, Annotation[ ] annotations) {
return nextResponseBodyConverter ( null, type, annotations) ;
}
从初始化时后,添加的convert中去匹配,如果返回的converter不为null,则返回,结束循环,如果没添加convert则使用系统默认的,匹配的顺序由添加时决定。
public < T> Converter< ResponseBody, T> nextResponseBodyConverter (
@Nullable Converter. Factory skipPast, Type type, Annotation[ ] annotations) {
Objects. requireNonNull ( type, "type == null" ) ;
Objects. requireNonNull ( annotations, "annotations == null" ) ;
int start = converterFactories. indexOf ( skipPast) + 1 ;
for ( int i = start, count = converterFactories. size ( ) ; i < count; i++ ) {
Converter< ResponseBody, ? > converter =
converterFactories. get ( i) . responseBodyConverter ( type, annotations, this ) ;
if ( converter != null) {
//noinspection unchecked
return ( Converter< ResponseBody, T> ) converter;
}
}