激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Android - RxJava之網(wǎng)絡(luò)請(qǐng)求最常見的三種場(chǎng)景

RxJava之網(wǎng)絡(luò)請(qǐng)求最常見的三種場(chǎng)景

2022-02-19 16:43塞上牧羊空許約 Android

本文想闡述一下當(dāng)你開發(fā)Android應(yīng)用并采用RxJava作為你的架構(gòu),尤其是有關(guān)網(wǎng)絡(luò)請(qǐng)求時(shí)最常見的三種場(chǎng)景。這篇文章主要介紹了RxJava之網(wǎng)絡(luò)請(qǐng)求最常見的三種場(chǎng)景,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文想闡述一下當(dāng)你開發(fā)Android應(yīng)用并采用RxJava作為你的架構(gòu),尤其是有關(guān)網(wǎng)絡(luò)請(qǐng)求時(shí)最常見的三種場(chǎng)景。

我使用Retrofit來作為網(wǎng)絡(luò)層,簡(jiǎn)單的內(nèi)存緩存-HashMap來做緩存,也可以使用Room或者其他數(shù)據(jù)庫(kù)實(shí)現(xiàn)來替代。
Retrofit接口有如下的一些簡(jiǎn)單方法,它獲取一個(gè)事件列表。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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ù)串連起來,但是執(zhí)行和觀察結(jié)果的代碼卻可以保持不變。

現(xiàn)在說一下開發(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ò)獲取。

?
1
2
3
4
5
6
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ā)射出來的值。所以如果緩存有值,這個(gè)值將會(huì)被發(fā)射并且調(diào)用onCompleted,此值即為返回值。網(wǎng)絡(luò)請(qǐng)求也將不會(huì)被調(diào)用,這也是我們所期待的。如果緩存沒有值,然后它便會(huì)調(diào)用onCompleted,此時(shí)也沒有發(fā)射任何一個(gè)值。因此網(wǎng)絡(luò)請(qǐng)求將會(huì)發(fā)生。使用MayBe暗示著觀察不到值的可能,例如,緩存為空且網(wǎng)絡(luò)也沒有返回結(jié)果。

發(fā)起兩個(gè)請(qǐng)求,第二個(gè)請(qǐng)求依賴于第一個(gè)

從網(wǎng)絡(luò)上取值并使用其部分結(jié)果發(fā)起另外一個(gè)網(wǎng)樓請(qǐng)求來獲取真正想要的數(shù)據(jù)。

?
1
2
3
4
5
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ā)射值。

?
1
2
3
4
5
6
7
8
9
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操作符來合并這三個(gè)Observables.它們被結(jié)合為一個(gè)MyViewModel的POJO.其構(gòu)造參數(shù)與源Observables的類型匹配

?
1
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í)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jianshu.com/p/b12c3d5e053c

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜视频在线免费观看 | 国产一国产一级毛片视频 | 欧美人与禽性xxxxx杂性 | 色综合视频网 | 午夜在线小视频 | 久久精品9 | 把娇妻调教成暴露狂 | 精品一区二区三区中文字幕老牛 | 国产午夜精品一区二区三区免费 | 久久精品国产99国产精品亚洲 | 国产青草视频在线观看 | 欧美视频国产 | 国产午夜精品一区二区三区四区 | 亚洲成人播放 | 天天草天天干天天 | 久草视频福利在线观看 | 中文字幕 日本 | 国产男女 爽爽爽爽视频 | 色婷婷久久久久久 | 高清在线国产 | 成人在线精品视频 | 国产毛片aaa一区二区三区视频 | 久久久国产精品成人免费 | 欧美一级做一a做片性视频 日韩黄色片免费看 | av中文字幕免费在线观看 | 欧美videofree性欧美另类 | 成人毛片一区二区三区 | 欧美a在线观看 | 国产成人视屏 | 天天操天天看 | 一区二区三区在线视频观看58 | 爱逼爱操综合网 | 爱唯侦察 国产合集 亚洲 | 亚洲第一男人天堂 | 99极品视频| 91美女啪啪 | 福利在线免费 | 蜜桃91麻豆| 亚洲成人在线免费观看 | 欧美一级网| 久久久久亚洲精品 |