RxJava之網(wǎng)絡(luò)請(qǐng)求最常見的三種場(chǎng)景
本文想闡述一下當(dāng)你開發(fā)Android應(yīng)用并采用RxJava作為你的架構(gòu),尤其是有關(guān)網(wǎng)絡(luò)請(qǐng)求時(shí)最常見的三種場(chǎng)景。
我使用Retrofit來(lái)作為網(wǎng)絡(luò)層,簡(jiǎn)單的內(nèi)存緩存-HashMap來(lái)做緩存,也可以使用Room或者其他數(shù)據(jù)庫(kù)實(shí)現(xiàn)來(lái)替代。
Retrofit接口有如下的一些簡(jiǎn)單方法,它獲取一個(gè)事件列表。
@GET("events") Single<List<Event>> getEventsFeed(...);
通過(guò)我的Repository接口來(lái)暴露,可訂閱如下:
Single<List<Event>> source = remoteRepository.getEventsFeed(...); source .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(data -> { // Do something with data e.g. pass it to a view. }, throwable -> { // Handle error e.g. get view to show dialog. } );
下面的例子中,我們將會(huì)改變“源”的定義方式,其余代碼不變,這也是RxJava的優(yōu)點(diǎn)之一,可以將復(fù)雜的異步任務(wù)串連起來(lái),但是執(zhí)行和觀察結(jié)果的代碼卻可以保持不變。
現(xiàn)在說(shuō)一下開發(fā)一個(gè)基本或中等復(fù)雜應(yīng)用時(shí)會(huì)遇到的三種情形。
1.從緩存或者網(wǎng)絡(luò)獲取數(shù)據(jù)
2.發(fā)起兩個(gè)請(qǐng)求,第二個(gè)請(qǐng)求依賴于第一個(gè)。
3.同時(shí)發(fā)起多個(gè)請(qǐng)求,并結(jié)合他們的結(jié)果。
從緩存或者網(wǎng)絡(luò)獲取數(shù)據(jù)
如果有緩存則從緩存中取值,否則從網(wǎng)絡(luò)獲取。
Maybe<List<Event>> source1 = cacheRepository.getEventsFeed(...); Single<List<Event>> source2 = networkRepository.getEventsFeed(...); Maybe<List<Event>> source = Maybe.concat(source1, source2.toMaybe()).firstElement();
這里我們使用concat操作符將兩個(gè)observable連接在一起,然而firstElement意味著我們只關(guān)心第一個(gè)發(fā)射出來(lái)的值。所以如果緩存有值,這個(gè)值將會(huì)被發(fā)射并且調(diào)用onCompleted,此值即為返回值。網(wǎng)絡(luò)請(qǐng)求也將不會(huì)被調(diào)用,這也是我們所期待的。如果緩存沒(méi)有值,然后它便會(huì)調(diào)用onCompleted,此時(shí)也沒(méi)有發(fā)射任何一個(gè)值。因此網(wǎng)絡(luò)請(qǐng)求將會(huì)發(fā)生。使用MayBe暗示著觀察不到值的可能,例如,緩存為空且網(wǎng)絡(luò)也沒(méi)有返回結(jié)果。
發(fā)起兩個(gè)請(qǐng)求,第二個(gè)請(qǐng)求依賴于第一個(gè)
從網(wǎng)絡(luò)上取值并使用其部分結(jié)果發(fā)起另外一個(gè)網(wǎng)樓請(qǐng)求來(lái)獲取真正想要的數(shù)據(jù)。
Single<User> source1 = networkRepository.getMyProfile(...); Single<List<Tweet>> source = source1.flatMap(user -> { return networkRepository.getUserTweets(user.getTwitterId()); });
同時(shí)發(fā)起多個(gè)請(qǐng)求,并結(jié)合他們的結(jié)果。
我有三個(gè)網(wǎng)絡(luò)請(qǐng)求,它們互不依賴,我想同時(shí)執(zhí)行以提高響應(yīng)時(shí)間。等到三個(gè)請(qǐng)求都結(jié)束后才發(fā)射值。
Single<List<Event>> source1 = networkRepository.getEventsFeed(...); Single<List<Bookmark>> source2 = networkRepository.getBookmarks(...); Single<Stats> source3 = networkRepository.getUserStats(...); Single<MyViewModel> source = Single.zip(source1, source2, source3, MyViewModel::new);
這個(gè)例子中,我們使用zip操作符來(lái)合并這三個(gè)Observables.它們被結(jié)合為一個(gè)MyViewModel的POJO.其構(gòu)造參數(shù)與源Observables的類型匹配
public MyViewModel(List<Event>, List<Bookmark>, Stats) {...}
當(dāng)你訂閱這個(gè)源Observable時(shí),將會(huì)同時(shí)發(fā)起三個(gè)網(wǎng)絡(luò)請(qǐng)求,但是只有當(dāng)它們都完成后才將新的MyViewModel實(shí)例發(fā)射出去。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android仿微信聯(lián)系人列表字母?jìng)?cè)滑控件
這篇文章主要為大家詳細(xì)介紹了Android仿微信聯(lián)系人列表字母?jìng)?cè)滑控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android跨應(yīng)用啟動(dòng)實(shí)例詳解
這篇文章主要介紹了 Android跨應(yīng)用啟動(dòng)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android自定義View實(shí)現(xiàn)圓環(huán)帶數(shù)字百分比進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓環(huán)帶數(shù)字百分比進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包
這篇文章主要介紹了使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Android 實(shí)現(xiàn)秒轉(zhuǎn)換成時(shí)分秒的方法
這篇文章主要介紹了Android 實(shí)現(xiàn)秒轉(zhuǎn)換成時(shí)分秒的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Android Studio 全屏沉浸式透明狀態(tài)欄效果的實(shí)現(xiàn)
這篇文章主要介紹了Android Studio 全屏沉浸式透明狀態(tài)欄效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11android實(shí)現(xiàn)背景音樂(lè)播放功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)背景音樂(lè)播放功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android分頁(yè)中顯示出下面翻頁(yè)的導(dǎo)航欄的布局實(shí)例代碼
這篇文章主要介紹了Android分頁(yè)中顯示出下面翻頁(yè)的導(dǎo)航欄的布局實(shí)例代碼,需要的朋友可以參考下2017-04-04淺談Android RecyclerView UI的滾動(dòng)控件示例
本篇文章主要介紹了淺談Android RecyclerView UI的滾動(dòng)控件示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02