Retrofit & Rxjava3
引用库
- 本文主要分析
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' 的源码
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
implementation "io.reactivex.rxjava3:rxjava:3.1.1"
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
代码示例
RxJava3CallAdapterFactory 用于配置callAdapter,RxJava3CallAdapterFactory#create() 默认情况下异步进行网络请求。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
Observable<List<Repo>> observable = service.listRepos("octocat");
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Repo>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.i(TAG, "onSubscribe");
}
@Override
public void onNext(@NonNull List<Repo> repos) {
Log.i(TAG, "onNext");
}
@Override
public void onError(@NonNull Throwable e) {
Log.i(TAG, "onError");
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete");
}
});
RxJava3CallAdapterFactory
- 生成CallAdapter,用于进行网络请求。将
retrofit2.Call<T> 转换为Observable<T> 对象。 - 构造函数可以配置scheduler调度器,还可以选择是否是异步请求。
RxJava3CallAdapterFactory#create 默认配置异步请求。
private RxJava3CallAdapterFactory(@Nullable Scheduler scheduler, boolean isAsync) {
this.scheduler = scheduler;
this.isAsync = isAsync;
}
RxJava3CallAdapterFactory#get 中会构造RxJava3CallAdapter 对象,返回给Retrofit网络请求是调用。
RxJava3CallAdapter
RxJava3CallAdapter#adapt(Call<R> call) 将标准的retrofit2.Call<T> 转换为Observable<T> 、Flowable<T> 、Maybe<T> 、Single<T> 等Rxjava对象。- Retrofit生成的默认
Observable 对象类型是retrofit2.adapter.rxjava3.CallEnqueueObservable 或者CallExecuteObservable 。参考RxJava3CallAdapter#adapt(Call<R> call) 。 - RxJava3CallAdapter构造函数通过几个布尔变量来决定返回的对象类型。这也代表了
com.squareup.retrofit2:adapter-rxjava3 所支持的Rxjava对象类型。
retrofit2.adapter.rxjava3.RxJava3CallAdapter#RxJava3CallAdapter
private final @Nullable Scheduler scheduler;
private final boolean isAsync;
private final boolean isResult;
private final boolean isBody;
private final boolean isFlowable;
private final boolean isSingle;
private final boolean isMaybe;
private final boolean isCompletable;
CallEnqueueObservable 和 CallExecuteObservable 实际发起了网络请求,调用了retrofit2.Call#enqueue 或者retrofit2.Call#execute 方法。
|