RxJava中的Single和Completable是什么

這篇文章主要介紹“RxJava中的Single和Completable是什么”,在日常操作中,相信很多人在RxJava中的Single和Completable是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”RxJava中的Single和Completable是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習吧!

贛縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

在大多數(shù) RxJava 示例代碼和教程中出現(xiàn)最為頻繁的一個類 —— Observable,它是產(chǎn)生響應(yīng)式編程魔力的關(guān)鍵。它的用法很簡單,只需要跟蹤 3 個事件,onNextonErroronCompleted就可以應(yīng)用上百個操作符來實現(xiàn)自己的表達式。那么為什么你還需要了解其他東西?

但是你仔細思考下,你真的需要每次都知道這 3 個事件嗎?實際上,在大多數(shù)情況下并不需要。ReactiveX 文檔中講述的基本都是關(guān)于連續(xù)的事件流,因此我們經(jīng)常忘記通常我們關(guān)心的只是監(jiān)聽單一事件或者只監(jiān)聽 completed or failed 事件。

在這種情況下我們應(yīng)該考慮用 RxJava 的兩個絕妙的設(shè)計 &mdash;&mdash; Single<T> 和 Completable,在分析兩者之前,讓我們先看看他們應(yīng)用場景的示例。

本文中所有代碼都是基于 RxJava 2.x ,不是 1.x 版本。如果你還沒升級 RxJava 到***的 2.x 版本, 強烈建議你馬上升級。

Single

在 Android 中使用 RxJava 最常見的場景就是網(wǎng)絡(luò)請求,你可能使用 Retrofit 作為項目的 Http client。假設(shè)你有一個 GET HTTP 請求返回一些數(shù)據(jù),同時使用 RxJavaAdapter 你大概會這么寫:

public interface APIClient {@GET("my/api/path")Observable<MyData> getMyData();
}

上面的代碼沒什么問題,當調(diào)用它時:

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

仔細思考下,其實這個網(wǎng)絡(luò)請求并不是一個連續(xù)事件流,你只會發(fā)起一次 Get 請求返回數(shù)據(jù)并且只收到一個事件。我們都知道這種情況下 onComplete 會緊跟著 onNext 被調(diào)用,那為什么不把它們合二為一呢?

在上面這種情況下為了更清楚的體現(xiàn)請求的意圖,應(yīng)該用Single<MyData>替換 Observable。從官方文檔中對 Single 的說明可以發(fā)現(xiàn)為什么它是最恰當?shù)倪x擇:A   Single is something like an Observable, but instead of emitting a   series of values?&mdash;?anywhere from none at all to an infinite number?&mdash;?it   always either emits one value or an error notification。所以修改后 API client 是這樣的:

public interface APIClient {@GET("my/api/path")Single<MyData> getMyData();
}

同時請求的調(diào)用也可以簡化:

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 基本上實現(xiàn)了 Observable 所有的操作符 &mdash;&mdash; map、flatMapfilter、zip等,如果你發(fā)現(xiàn)需要用到一個 Observable 的操作符而 Single 并不支持,你可以用toObservable操作符把Single<T>轉(zhuǎn)換為Observable<T>。

apiClient.getMyData()
    .toObservable()// This is an Observable<MyData> now

如果你有 Observable 表現(xiàn)地像 Single 一樣,也可以通過singleOrError操作符轉(zhuǎn)換為 Single。

Completable

繼續(xù)討論 Retrofit 的例子,再看看另外一種常用場景 &mdash;&mdash; 通過 PUT 請求更新數(shù)據(jù)。我們修改了 MyData   類型對象的一些屬性,把它發(fā)送到服務(wù)器更新服務(wù)器數(shù)據(jù)庫。大部分服務(wù)器 API 設(shè)計都是成功后返回更新后的對象,所以你的 API client   的實現(xiàn)是:

public interface APIClient {@PUT("my/api/updatepath")Observable<MyData> updateMyData(@Body MyData data);
}

同樣的,跟之前的例子類似,應(yīng)該這樣調(diào)用:

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 來簡化代碼,是的沒錯。在這種情況下我們?nèi)匀恍枰?MyData   結(jié)果,確定?服務(wù)器返回給我們更新后的數(shù)據(jù)是良好的設(shè)計,當時實際上僅僅是返回給我們之前發(fā)送給它的對象。我們真正需要的只是更新成功了,這意味著,我只關(guān)心   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);
}

調(diào)用為:

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 本質(zhì)上來說和 Observable 與 Single 不一樣,因為它不發(fā)射數(shù)據(jù)。因此 Completable 的操作符也有所區(qū)別,最常用的是andThen。在這個操作符中你可以傳任何Observable、Single、Flowable、Maybe或者其他Completable,它們會在原來的 Completable 結(jié)束后執(zhí)行。例如。你想執(zhí)行一些其他操作(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 轉(zhuǎn)換為 Completable,因為沒辦法知道一個   Observable 什么時候 complete。但是你可以把 Single 轉(zhuǎn)換為 Completable,因為 Single 保證   onComplete 會被調(diào)用,這個操作符是toCompletable

到此,關(guān)于“RxJava中的Single和Completable是什么”的學(xué)習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習,快去試試吧!若想繼續(xù)學(xué)習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

當前文章:RxJava中的Single和Completable是什么
標題鏈接:http://muchs.cn/article8/pidpop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)建站公司、外貿(mào)建站、、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化