1.retrofit.create 创建retrofit
2.loadServiceMethod(method).invoke(args) 动态代理method,并在repos.enqueue 中调用invoke
3.ServiceMethod.parseAnnotations(this, method)
4.RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method); 解析注解,生成requestFactory
5.HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory) 生成HttpServiceMethod 方法,初始化
RequestFactory requestFactory,
okhttp3.Call.Factory callFactory,
Converter<ResponseBody, ResponseT>responseConverter) {
this.requestFactory = requestFactory;
this.callFactory = callFactory;
this.responseConverter = responseConverter;
6.HttpServiceMethod 的invoke 为
@Override
final @Nullable ReturnT invoke(Object[] args) {
Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);
return adapt(call, args);
}
@Override
protected ReturnT adapt(Call<ResponseT> call, Object[] args) {
return callAdapter.adapt(call);
}
现在开始追callAdapter
return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter);
CallAdapter<ResponseT, ReturnT>callAdapter =
createCallAdapter(retrofit, method, adapterType, annotations);
private static <ResponseT, ReturnT> CallAdapter<ResponseT, ReturnT> createCallAdapter(
Retrofit retrofit, Method method, Type returnType, Annotation[] annotations) {
try {
//noinspection unchecked
return (CallAdapter<ResponseT, ReturnT>) retrofit.callAdapter(returnType, annotations);
} catch (RuntimeException e) { // Wide exception range because factories are user code.
throw methodError(method, e, "Unable to create call adapter for %s", returnType);
}
}
CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this);
现在开始追callAdapterFactories的get方法
List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
return new CallAdapter<Object, Call<?>>() {
@Override
public Type responseType() {
return responseType;
}
@Override
public Call<Object> adapt(Call<Object> call) {
return executor == null ? call : new ExecutorCallbackCall<>(executor, call);
}
};
实际上 adapt调用的是 ExecutorCallbackCall<>(executor, call) 方法
ExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) {
this.callbackExecutor = callbackExecutor;
this.delegate = delegate;
}
初始化了一个call
retrofit.create(GitHubService::class.java) 整个代码 就是初始化了一个ExecutorCallbackCall
service.listRepos 是获取接口上初始上的方法
repos.enqueue 实际上也就是调用 ExecutorCallbackCall里面的enqueue,
this.delegate = delegate; 这个delegate是invoke的第一行传入的OkHttpCall
@Override
public void enqueue(final Callback<T> callback) {
Objects.requireNonNull(callback, "callback == null");
delegate.enqueue(
new Callback<T>() {
@Override
public void onResponse(Call<T> call, final Response<T> response) {
callbackExecutor.execute(
() -> {
if (delegate.isCanceled()) {
// Emulate OkHttp's behavior of throwing/delivering an IOException on
// cancellation.
callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
} else {
callback.onResponse(ExecutorCallbackCall.this, response);
}
});
}
@Override
public void onFailure(Call<T> call, final Throwable t) {
callbackExecutor.execute(() -> callback.onFailure(ExecutorCallbackCall.this, t));
}
});
总结:retrofit2通过动态代理 + 注解取出关键信息,初始化接口里面的方法,初始化方法后用invoke,生成okhttpcall 调用 apat 初始化 试配器的calll
通过包装okhttp call实现enqueue ,将okhttp call装饰者模式包装了一层call,使用excute+handle
实现线程切换,回调接口
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(GitHubService::class.java)
val repos: Call<List<Repo>> = service.listRepos("octocat")
repos.enqueue(object:Callback<List<Repo>> {
override fun onResponse(call: Call<List<Repo>>, response: Response<List<Repo>>) {
}
override fun onFailure(call: Call<List<Repo>>, t: Throwable) {
}
})