Android开发中,Retrofit + okhttp 的组合非常流行,原因是使用方便,扩展性好。下面分析下Retrofit 源码及扩展性好的地方:
Retrofit 原理简单,通过动态代理实现接口请求,委托类是ServiceMethod.
这有个兼容处理,如果是普通委托请求,调用原生的委托;如果是平台委托请求,调用平台的委托;剩下的走Retrofit 中的委托。
Retrofit 细节不容易理解是因为框架用了很多泛型,注解。导致源码的可读性差。
ServiceMethod 做的事情
- request参数转化,
- response参数转化.
- Retrofit.call 转成 okhttp.call,
private final okhttp3.Call.Factory callFactory;
private final List<Converter.Factory> converterFactories;
private final List<CallAdapter.Factory> adapterFactories;
private final Executor callbackExecutor;
这是Retrofit 中几个主要类,明白了他们的作用,也就明白了源码。
converterFactories 负责request,response参数转化。
ConvertFactory 主要的两个方法:requestBodyConverter,responseBodyConverter负责request,response的转化。
abstract class Factory {
public Converter<ResponseBody, ?> responseBodyConverter() {
return null;
}
public Converter<?, RequestBody> requestBodyConverter() {
return null;
}
public Converter<?, String> stringConverter() {
return null;
}
}
converterFactories 是个list ,根椐接口入参取到第一个合适的返回。
int start = adapterFactories.indexOf(skipPast) + 1;
for (int i = start, count = adapterFactories.size(); i < count; i++) {
CallAdapter<?> adapter = adapterFactories.get(i).get(returnType, annotations, this);
if (adapter != null) {
return adapter;
}
}
在Retrofit 初始化时,都会加个 GsonConverterFactory.create(),另外可使用的扩展如下:
Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars : com.squareup.retrofit2:converter-scalars
adapterFactories 负责call, rxjava的转化。
Retrofit初始化时,会添加ExecutorCallAdapterFactoires,这也是我们默认使用的callAdapter. 也可以使用 RxjavaCallAdapterFactories是rxjava的转化器. 这根椐接口的出参选择使用哪一个。
@Override
public CallAdapter<Call<?>> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
## 首先根椐 returnType 取出responseType , 返回ExecutorCallbackCall
final Type responseType = Utils.getCallResponseType(returnType);
return new CallAdapter<Call<?>>() {
@Override public <R> Call<R> adapt(Call<R> call) {
return new ExecutorCallbackCall<>(callbackExecutor, call);
}
};
}
## enqueue 实际执行者
@Override public void enqueue(final Callback<T> callback) {
delegate.enqueue(new Callback<T>() {
@Override public void onResponse(Call<T> call, final Response<T> response) {
callbackExecutor.execute(new Runnable() {
@Override public void run() {
if (delegate.isCanceled()) {
callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
} else {
callback.onResponse(ExecutorCallbackCall.this, response);
}
}
});
}
});
}