国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - RxJava之網絡請求最常見的三種場景

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

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

本文想闡述一下當你開發Android應用并采用RxJava作為你的架構,尤其是有關網絡請求時最常見的三種場景。這篇文章主要介紹了RxJava之網絡請求最常見的三種場景,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

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

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

從緩存或者網絡獲取數據

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

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

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

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

?
1
2
3
4
5
Single<User> source1 =
  networkRepository.getMyProfile(...);
Single<List<Tweet>> source = source1.flatMap(user -> {
    return networkRepository.getUserTweets(user.getTwitterId());
  });

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

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

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

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 懂色av一区二区三区免费观看 | 特级淫片日本高清视频免费 | 亚洲综合影院 | 精品九九久久 | 亚洲品质自拍视频网站 | 久久久天天 | 亚洲啪啪 | 亚洲精品一区二三区不卡 | 日日精品 | 久久精品播放 | 青娱乐国产精品视频 | 91婷婷射 | 免费观看全黄做爰大片国产 | 免费高潮 | 久久亚洲欧美日韩精品专区 | 国产精品视频久久久 | 国产欧美一区二区精品久久 | 九九九色 | 亚洲视频自拍 | 免费一级片在线 | 亚洲综合首页 | 一本久久a久久精品亚洲 | 黄色网页免费看 | 国产精品三级久久久久久电影 | 成人午夜在线观看 | 久久久亚洲综合 | 国产综合人综合 | 韩国精品一区二区三区 | 一级一片在线播放在线观看 | 黄色影视在线免费观看 | 视频一区二区三区中文字幕 | 国产欧美日韩在线观看 | 日韩一级电影在线 | 99热精品在线 | 亚洲天堂电影 | 色天天天天色 | 精品福利一区二区三区 | 正在播放国产一区 | 亚洲美女久久久 | 天天干天天射天天操 | 国产精品毛片久久久久久 |