Retrofit & Rxjava3
- Retrofit:https://blog.csdn.net/followYouself/article/details/120317044
引用库
- 本文主要分析 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' // rxJava的适配器
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/") // 配置URL
// 配置网络请求的adapter,将retrofit2.Call转换为Observable对象
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create()) // 配置解析网络返回数据的apdater,解析json
.build();
GitHubService service = retrofit.create(GitHubService.class);
Observable> observable = service.listRepos("octocat"); // observable对象类型retrofit2.adapter.rxjava3.CallEnqueueObservable
observable.subscribeOn(Schedulers.io()) // 配置网络请求的IO方式
.observeOn(AndroidSchedulers.mainThread()) // 在主线程处理收到的数据
.subscribe(new Observer>() { // subscribe函数调用之后才真正的发起网络请求
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.i(TAG, "onSubscribe");
}
@Override
public void onNext(@NonNull List 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转换为Observable对象。
- 构造函数可以配置scheduler调度器,还可以选择是否是异步请求。RxJava3CallAdapterFactory#create默认配置异步请求。
private RxJava3CallAdapterFactory(@Nullable Scheduler scheduler, boolean isAsync) {
this.scheduler = scheduler;
this.isAsync = isAsync;
}
- RxJava3CallAdapterFactory#get中会构造RxJava3CallAdapter对象,返回给Retrofit网络请求是调用。
RxJava3CallAdapter
- RxJava3CallAdapter#adapt(Call call)将标准的retrofit2.Call转换为Observable、Flowable、Maybe、Single等Rxjava对象。
- Retrofit生成的默认Observable对象类型是retrofit2.adapter.rxjava3.CallEnqueueObservable或者CallExecuteObservable。参考RxJava3CallAdapter#adapt(Call call)。
- RxJava3CallAdapter构造函数通过几个布尔变量来决定返回的对象类型。这也代表了com.squareup.retrofit2:adapter-rxjava3所支持的Rxjava对象类型。
retrofit2.adapter.rxjava3.RxJava3CallAdapter#RxJava3CallAdapter
private final @Nullable Scheduler scheduler; // 被观察者的线程调度器,RxJava3CallAdapterFactory可以配置
private final boolean isAsync; // 网络请求是同步还是异步
private final boolean isResult;
private final boolean isBody; // onNext中参数是response.body()的返回值
private final boolean isFlowable; // Flowable类型
private final boolean isSingle; //Single类型
private final boolean isMaybe; // Maybe 类型
private final boolean isCompletable;
- CallEnqueueObservable 和 CallExecuteObservable实际发起了网络请求,调用了retrofit2.Call#enqueue或者retrofit2.Call#execute方法。