使用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) {...}
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。