Retrofit & Rxjava3 & RxAndroid

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' // rxJava的适配器

implementation "io.reactivex.rxjava3:rxjava:3.1.1"
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

代码示例

  • 先定义一个Interface,返回的对象是Observable<T>或者Flowable<T>对象
  • RxJava3CallAdapterFactory用于配置callAdapter,RxJava3CallAdapterFactory#create()默认情况下异步进行网络请求。
interface GitHubService {
    
    
    @GET("users/{user}/repos")
    Observable<List<Repo>> listRepos(@Path("user") String user);
}
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/") // 配置URL
         // 配置网络请求的adapter,将retrofit2.Call<T>转换为Observable<T>对象
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create()) // 配置解析网络返回数据的apdater,解析json
        .build();

GitHubService service = retrofit.create(GitHubService.class);
Observable<List<Repo>> observable = service.listRepos("octocat"); // observable对象类型retrofit2.adapter.rxjava3.CallEnqueueObservable
observable.subscribeOn(Schedulers.io()) // 配置网络请求的IO方式
        .observeOn(AndroidSchedulers.mainThread()) // 在主线程处理收到的数据
        .subscribe(new Observer<List<Repo>>() {
    
     // subscribe函数调用之后才真正的发起网络请求
            @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; // 被观察者的线程调度器,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;
  • CallEnqueueObservableCallExecuteObservable实际发起了网络请求,调用了retrofit2.Call#enqueue或者retrofit2.Call#execute方法。

猜你喜欢

转载自blog.csdn.net/followYouself/article/details/120570859