Android Retrofit2.0+RxJava3.0 基本使用

2020-10-25 15:00:25

一,ReactiveX

要學習RxJava,那麼不得不提他的由來ReactiveX,ReactiveX 是一個專注於非同步程式設計與控制可觀察資料(或者事件)流的API。它組合了觀察者模式,迭代器模式和函數語言程式設計的優秀思想。ReactiveX是Reactive Extensions的縮寫,一般簡寫為Rx,最初是LINQ的一個擴充套件,由微軟的架構師Erik Meijer領導的團隊開發;

二,Rx的發展

Rx這幾年非常流行,以至於開發出多種語言版本,例如RxJava 、 RxGo 、RxJS、RxKotlin、RxPYRx.NET等等;Rx的大部分語言庫由ReactiveX這個組織負責維護,社群網站是 reactivex.io

三,RxJava

RxJava是響應式程式設計(Reactive Extensions)的java實現,它基於觀察者模式的實現了非同步程式設計介面。

Rxjava 3.x 的github官網

Rxjava 3.0的一些改變:官方Wiki

Rxjava 3.x 檔案可以在官方javadoc中找到

1,Retrofit + RxJava3組合使用

首先要引入依賴

    implementation "io.reactivex.rxjava3:rxjava:3.0.0"
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'com.squareup.retrofit2:retrofit:2.7.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

相關設定module下的build.gradle

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

注意Retrofit和RxJava組合使用時,Retrofit中使用的rxjava介面卡(adapter-rxjava3)要和RxJava版本(io.reactivex.rxjava3:rxjava:3.0.0)一致;如本例都是使用的時3.0;關於先前Rerotfit沒有Rxjava3.0介面卡問題;

建立Retrofit時如果要使用rxjava適配,注意不要寫錯,正確姿勢如下程式碼:

Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJava3CallAdapterFactory.createSynchronous())
                // Or
                // .addCallAdapterFactory(RxJava3CallAdapterFactory.createWithScheduler(Schedulers.io()))
                .baseUrl("")
                .build();

2,Retrofit + RxJava組合使用

如果要使用1.0可以這樣新增依賴

 implementation 'io.reactivex:rxjava:1.0.14
 implementation 'io.reactivex:rxandroid:1.0.1'
 implementation 'com.squareup.retrofit2:retrofit:2.0.2'
 implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

Retrofit建立的正確姿勢:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.baidu.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

3,Retrofit + RxJava2.0組合使用

關於RxJava2.0的使用要從一個異常說起:

異常:

Could not locate call adapter for io.reactivex.Observable<okhttp3.ResponseBody>.

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' RxJava介面卡是1.0

所以換成RxJava2.0就可以了,原因Android專案中使用的是RxJava2.0,那麼Retrofit要配合Rxjava使用,相應的要設定Rxjava2.0介面卡;以此類推如果要使用Rxjava3.0那麼相應的Retrofit中的

兩種方式設定Retrofit中使用的RxJava2.0介面卡

1,第三方的提供的RxJava2.0介面卡

implementation  'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

2,從Retrofit 2.2.0版開始,RxJava2有一個官方提供的介面卡:

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(new OkHttpClient.Builder().build())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();
return retrofit.create(serviceClass);

四,Retrofit+Rxjava2具體使用案例

Retrofit+Rxjava2實現圖片批次下載的功能