前言
上一节讲完后还有一个callAdapterFactory没有细讲.我们先看下这个代码
val retrofit = Retrofit.Builder()
.baseUrl("http://localhost/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
interface MainNetwork {
@GET("next_title.json")
fun fetchNextTitle(): Observable<Title>
}
这里我们就用RxJava2CallAdapterFactory来作讲解。
RxJava2CallAdapterFactory
还记得之前的代码么
loadServiceMethod(method).invoke(args);
这个invoke最终走的是
callAdapter.adapt(call);
这里我们用RxJava2CallAdapter来做分析。
final class RxJava2CallAdapter<R> implements CallAdapter<R, Object>{
@Override
public Object adapt(Call<R> call) {
Observable<Response<R>> responseObservable =
isAsync ? new CallEnqueueObservable<>(call) : new CallExecuteObservable<>(call);
Observable<?> observable;
if (isResult) {
observable = new ResultObservable<>(responseObservable);
} else if (isBody) {
observable = new BodyObservable<>(responseObservable);
} else {
observable = responseObservable;
}
if (scheduler != null) {
observable = observable.subscribeOn(scheduler);
}
if (isFlowable) {
return observable.toFlowable(BackpressureStrategy.LATEST);
}
if (isSingle) {
return observable.singleOrError();
}
if (isMaybe) {
return observable.singleElement();
}
if (isCompletable) {
return observable.ignoreElements();
}
return RxJavaPlugins.onAssembly(observable);//其实就是返回observable
}
}
从这里可以看出,adapt()方法主要是将返回结果转变为observable,callAdapterFactory就是通过calladapter将原始Call进行封装,找到对应的执行器。如这里就是将Call转为Observable。
网友评论