一、CallAdapter
Retrofit天生支持RxJava类型的Call,DefaultCall,Guava等Call的回调,这是因为我们在为retrofit添加它所支持的每一个call都通过一个适配器模式,使它们转换成了一种类型的call,也就是多种输入,一种输出。retrofit提供了CallAdapter.抽象类,它内部又有一个Factory,工厂方法定义了如何生成CallAdapter,CallAdapter定义了如何拿到Call。
**Factroy----->CallAdapter------>Call
public interface CallAdapter<T> {
Type responseType();
<R> T adapt(Call<R> call);
abstract class Factory {
public abstract CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit);
protected static Class<?> getRawType(Type type) { return Utils.getRawType(type); }
}
}
二、继承Factory的类
可以看到,在calladapter中定义了一个adapt方法,该方法负责将传入的Call<R>,返回出去。在返回之前进行了会进行一些列的转换。具体使用的开端是在retrofit的create方法中
serviceMethod.calladapter.adapt方法经历的步骤。
1.首先是loadServiceMethod会将retrofit自己传递个ServiceMethod.Builder
2.ServiceMethod调用createAdapter方法,实际上是通过retrofit的nextCallAdapter, 也就是说servcie的calladapter通过nextCallAdapte拿到。
3.拿到callAdapter后,调用它的adapt方法再拿到call对象。
总的来说就是:
nextCallAdapter方法会调用实现了Factory方法的get方法去拿到calladapter对象,
calladapter提供adapt方法拿到call对象
例如
1.DefaultCallAdapterFactory
默认的callAdapterFactory,它在get方法中创建了一个callAdapter对象,该对象的adapt方法就是将传入进来的call再返回出去。没有做特殊处理。
final class DefaultCallAdapterFactory extends CallAdapter.Factory {
static final CallAdapter.Factory INSTANCE = new DefaultCallAdapterFactory();
@Override
public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
//不支持不是Call类型的
if (getRawType(returnType) != Call.class) {
return null;
}
final Type responseType = Utils.getCallResponseType(returnType);
return new CallAdapter<Call<?>>() {
@Override
public Type responseType() {
return responseType;
}
/** * 负责给外部拿到Call 将传入的Call抛出去 * @param call 回调 * @param <R> 类型 * @return */
@Override
public <R> Call<R> adapt(Call<R> call) {
return call; }
};
}
}
2.RxJavaCallAdapterFactory
返回的是一种CallAdapter<Observable<?>>的callAdapter
adapt方法返回call时,会进行一定的装饰