在流程梳理篇,我们介绍了ServiceMethod是其retrofit的核心部分,这篇我们就着重分析retrofit的ServiceMethod这个处理类
build建造者部分
对于ServiceMethod这部分的build,其构造如下:
Builder(Retrofit retrofit, Method method) {
this.retrofit = retrofit;
this.method = method;
this.methodAnnotations = method.getAnnotations();
this.parameterTypes = method.getGenericParameterTypes();
this.parameterAnnotationsArray = method.getParameterAnnotations();
}
这里传入了retrofit本身和目标的方法method
从method的getAnnotations/getGenericParameterTypes/getParameterAnnotations
这些方法中,可以看出retrofit这部分就是想方设法从method上获取到所有的信息
从上面的构造入手,一下子就想到在使用的时候我们的一些做法,举例:
@FormUrlEncoded
@POST("openapi.do")
public abstract Call<TranslateBean> hello(@Field("keyfrom") String keyfrom,
@Field("key") String key);
众所周知,一个request的组成基本上参数部分都是key-vale形式组成,那就不难理解为什么retrofit要求我们从通过方法注解/参数注解这些方式传入对应的关系了
理解了参数部分,我们看看build建造者最关键的方法build方法:
build方法较多,我们先折叠起来,看前半部分:
public ServiceMethod build() {
callAdapter = createCallAdapter();
responseType = callAdapter.responseType();
responseConverter = createResponseConverter();
...省略部分代码
return new ServiceMethod<>(this);
}
build方法上首先创建了一个callAdapter,提起callAdapter不免立马想到我们使用时传入的RxJavaCallAdapterFactory部分,我们顺着createCallAdapter看看跟我们RxJavaCallAdapterFactory有没有关系,
private CallAdapter<T, R> createCallAdapter() {
/**
* 首先通过method获取返回值类型,紧跟着对返回值类型合法性验证
*/
Type returnType = method.getGenericReturnType();
if (Utils.hasUnresolvableType(returnType)) {
throw methodError(
"Method return type must not include a type variable or wildcard: %s", returnType);
}
if (returnType == void.class) {
throw methodError("Service methods cannot return void.");
}
/**
* 接着获取方法上的注解,根据返回值类型和方法上的注解,调用retrofit的callAdapter
*/
Annotation[] annotations = method.getAnnotations();
try {
//noinspection unchecked
return (CallAdapter<T, R>) retrofit.callAdapter(returnType, annotations);
} catch (RuntimeException e) {
// Wide exception range because factories are user code.
throw methodError(e, "Unable to create call adapter for %s", returnType);
}
}
而对于retrofit的callAdapter方法其上注解是这样描述的:
/**
* Returns the