国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

RxJava之網絡請求最常見的三種場景

2019-10-22 18:11:29
字體:
來源:轉載
供稿:網友

本文想闡述一下當你開發Android應用并采用RxJava作為你的架構,尤其是有關網絡請求時最常見的三種場景。

我使用Retrofit來作為網絡層,簡單的內存緩存-HashMap來做緩存,也可以使用Room或者其他數據庫實現來替代。
Retrofit接口有如下的一些簡單方法,它獲取一個事件列表。

@GET("events")Single<List<Event>> getEventsFeed(...);

通過我的Repository接口來暴露,可訂閱如下:

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.      }    );

下面的例子中,我們將會改變“源”的定義方式,其余代碼不變,這也是RxJava的優點之一,可以將復雜的異步任務串連起來,但是執行和觀察結果的代碼卻可以保持不變。

現在說一下開發一個基本或中等復雜應用時會遇到的三種情形。
1.從緩存或者網絡獲取數據
2.發起兩個請求,第二個請求依賴于第一個。
3.同時發起多個請求,并結合他們的結果。

從緩存或者網絡獲取數據

如果有緩存則從緩存中取值,否則從網絡獲取。

Maybe<List<Event>> source1 =  cacheRepository.getEventsFeed(...);Single<List<Event>> source2 =  networkRepository.getEventsFeed(...);Maybe<List<Event>> source =     Maybe.concat(source1, source2.toMaybe()).firstElement();

這里我們使用concat操作符將兩個observable連接在一起,然而firstElement意味著我們只關心第一個發射出來的值。所以如果緩存有值,這個值將會被發射并且調用onCompleted,此值即為返回值。網絡請求也將不會被調用,這也是我們所期待的。如果緩存沒有值,然后它便會調用onCompleted,此時也沒有發射任何一個值。因此網絡請求將會發生。使用MayBe暗示著觀察不到值的可能,例如,緩存為空且網絡也沒有返回結果。

發起兩個請求,第二個請求依賴于第一個

從網絡上取值并使用其部分結果發起另外一個網樓請求來獲取真正想要的數據。

Single<User> source1 =  networkRepository.getMyProfile(...);Single<List<Tweet>> source = source1.flatMap(user -> {    return networkRepository.getUserTweets(user.getTwitterId());  });

同時發起多個請求,并結合他們的結果。

我有三個網絡請求,它們互不依賴,我想同時執行以提高響應時間。等到三個請求都結束后才發射值。

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);

這個例子中,我們使用zip操作符來合并這三個Observables.它們被結合為一個MyViewModel的POJO.其構造參數與源Observables的類型匹配

public MyViewModel(List<Event>, List<Bookmark>, Stats) {...}

當你訂閱這個源Observable時,將會同時發起三個網絡請求,但是只有當它們都完成后才將新的MyViewModel實例發射出去。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金川县| 浦北县| 宽城| 剑阁县| 乌拉特后旗| 合作市| 潜江市| 集安市| 南康市| 普安县| 炉霍县| 潜山县| 甘谷县| 凤山市| 奉贤区| 池州市| 苍梧县| 易门县| 兴安盟| 岳西县| 综艺| 嘉荫县| 咸阳市| 庆云县| 舒兰市| 龙泉市| 丰台区| 伊通| 水城县| 资溪县| 高邮市| 桐乡市| 娄烦县| 平阴县| 潼关县| 比如县| 十堰市| 盐边县| 绥阳县| 桐梓县| 乐都县|