您好,登錄后才能下訂單哦!
這篇文章主要介紹“RxJava中的Single和Completable是什么”,在日常操作中,相信很多人在RxJava中的Single和Completable是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”RxJava中的Single和Completable是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在大多數 RxJava 示例代碼和教程中出現最為頻繁的一個類 —— Observable
,它是產生響應式編程魔力的關鍵。它的用法很簡單,只需要跟蹤 3 個事件,onNext
,onError
和onCompleted
就可以應用上百個操作符來實現自己的表達式。那么為什么你還需要了解其他東西?
但是你仔細思考下,你真的需要每次都知道這 3 個事件嗎?實際上,在大多數情況下并不需要。ReactiveX 文檔中講述的基本都是關于連續的事件流,因此我們經常忘記通常我們關心的只是監聽單一事件或者只監聽 completed or failed 事件。
在這種情況下我們應該考慮用 RxJava 的兩個絕妙的設計 —— Single<T>
和 Completable
,在分析兩者之前,讓我們先看看他們應用場景的示例。
本文中所有代碼都是基于 RxJava 2.x ,不是 1.x 版本。如果你還沒升級 RxJava 到***的 2.x 版本, 強烈建議你馬上升級。
在 Android 中使用 RxJava 最常見的場景就是網絡請求,你可能使用 Retrofit 作為項目的 Http client。假設你有一個 GET HTTP 請求返回一些數據,同時使用 RxJavaAdapter 你大概會這么寫:
public interface APIClient {@GET("my/api/path")Observable<MyData> getMyData(); }
上面的代碼沒什么問題,當調用它時:
apiClient.getMyData() .subscribe(new Consumer<MyData myData>() {@Overridepublic void accept(MyData myData) throws Exception {// handle data fetched successfully} }, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error event} }, new Action() {@Overridepublic void run() throws Exception {// handle on complete event} });
仔細思考下,其實這個網絡請求并不是一個連續事件流,你只會發起一次 Get 請求返回數據并且只收到一個事件。我們都知道這種情況下 onComplete 會緊跟著 onNext 被調用,那為什么不把它們合二為一呢?
在上面這種情況下為了更清楚的體現請求的意圖,應該用Single<MyData>
替換 Observable。從官方文檔中對 Single 的說明可以發現為什么它是最恰當的選擇:A Single is something like an Observable, but instead of emitting a series of values?—?anywhere from none at all to an infinite number?—?it always either emits one value or an error notification。所以修改后 API client 是這樣的:
public interface APIClient {@GET("my/api/path")Single<MyData> getMyData(); }
同時請求的調用也可以簡化:
apiClient.getMyData() .subscribe(new Consumer<MyData>() {@Overridepublic void accept(MyData myData) throws Exception {// handle data fetched successfully and API call completed} }, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error event} });
最值得高興的是 Single 基本上實現了 Observable 所有的操作符 —— map
、flatMap
、filter
、zip
等,如果你發現需要用到一個 Observable 的操作符而 Single 并不支持,你可以用toObservable
操作符把Single<T>
轉換為Observable<T>
。
apiClient.getMyData() .toObservable()// This is an Observable<MyData> now
如果你有 Observable 表現地像 Single 一樣,也可以通過singleOrError
操作符轉換為 Single。
繼續討論 Retrofit 的例子,再看看另外一種常用場景 —— 通過 PUT 請求更新數據。我們修改了 MyData 類型對象的一些屬性,把它發送到服務器更新服務器數據庫。大部分服務器 API 設計都是成功后返回更新后的對象,所以你的 API client 的實現是:
public interface APIClient {@PUT("my/api/updatepath")Observable<MyData> updateMyData(@Body MyData data); }
同樣的,跟之前的例子類似,應該這樣調用:
apiClient.updateMyData(myUpdatedData) .subscribe(new Consumer<MyData myData>() {@Overridepublic void accept(MyData myData) throws Exception {// handle data fetched successfully and API call completed} }, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error event} }, new Action() {@Overridepublic void run() throws Exception {// handle completion - what we actually care about} });
你可能會說這里我們可以同樣用 Single 來簡化代碼,是的沒錯。在這種情況下我們仍然需要 MyData 結果,確定?服務器返回給我們更新后的數據是良好的設計,當時實際上僅僅是返回給我們之前發送給它的對象。我們真正需要的只是更新成功了,這意味著,我只關心 onComplete 事件。
這也是引入Completable
的原因,官方文檔對它的描述是:Represents a computation without any value but only indication for completion or exception。使用 Completable 時我們忽略 onNext 事件,只處理 onComplete 和 onError 事件,API client 改寫為:
public interface APIClient {@PUT("my/api/updatepath")Completable updateMyData(@Body MyData data); }
調用為:
apiClient.updateMyData(myUpdatedData) .subscribe(new Action() {@Overridepublic void run() throws Exception {// handle completion} }, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error} });
Completable 本質上來說和 Observable 與 Single 不一樣,因為它不發射數據。因此 Completable 的操作符也有所區別,最常用的是andThen
。在這個操作符中你可以傳任何Observable
、Single
、Flowable
、Maybe
或者其他Completable
,它們會在原來的 Completable 結束后執行。例如。你想執行一些其他操作(Single):
apiClient.updateMyData(myUpdatedData) .andThen(performOtherOperation()) // a Single<OtherResult>.subscribe(new Consumer<OtherResult>() {@Overridepublic void accept(OtherResult result) throws Exception {// handle otherResult} }, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error} });
跟 Single 不同的是 RxJava 不允許直接把 Observable 轉換為 Completable,因為沒辦法知道一個 Observable 什么時候 complete。但是你可以把 Single 轉換為 Completable,因為 Single 保證 onComplete 會被調用,這個操作符是toCompletable
。
到此,關于“RxJava中的Single和Completable是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。