日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
理解RxJava中的Single和Completable

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

在黔西南州等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網站、成都網站建設 網站設計制作定制網站開發(fā),公司網站建設,企業(yè)網站建設,成都品牌網站建設,全網整合營銷推廣,外貿網站制作,黔西南州網站建設費用合理。

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

在這種情況下我們應該考慮用 RxJava 的兩個絕妙的設計 —— Single 和 Completable,在分析兩者之前,讓我們先看看他們應用場景的示例。

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

Single

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

public interface APIClient {

    @GET("my/api/path")
    Observable getMyData();
}

上面的代碼沒什么問題,當調用它時:

apiClient.getMyData()
    .subscribe(new Consumer() {
        @Override
        public void accept(MyData myData) throws Exception {
            // handle data fetched successfully
        }
    }, new Consumer() {
        @Override
        public void accept(Throwable throwable) throws Exception{
            // handle error event
        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            // handle on complete event
        }
    });

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

在上面這種情況下為了更清楚的體現(xiàn)請求的意圖,應該用Single替換 Observable。從官方文檔中對 Single 的說明可以發(fā)現(xiàn)為什么它是最恰當?shù)倪x擇: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 getMyData();
}

同時請求的調用也可以簡化:

apiClient.getMyData()
    .subscribe(new Consumer() {
        @Override
        public void accept(MyData myData) throws Exception {
            // handle data fetched successfully and API call completed
        }
    }, new Consumer() {
        @Override
        public void accept(Throwable throwable) throws Exception{
            // handle error event
        }
    });

最值得高興的是 Single 基本上實現(xiàn)了 Observable 所有的操作符 —— map、flatMapfilter、zip等,如果你發(fā)現(xiàn)需要用到一個 Observable 的操作符而 Single 并不支持,你可以用toObservable操作符把Single轉換為Observable。

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

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

Completable

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

public interface APIClient {

    @PUT("my/api/updatepath")
    Observable updateMyData(@Body MyData data);
}

同樣的,跟之前的例子類似,應該這樣調用:

apiClient.updateMyData(myUpdatedData)
    .subscribe(new Consumer() {
        @Override
        public void accept(MyData myData) throws Exception {
            // handle data fetched successfully and API call completed
        }
    }, new Consumer() {
        @Override
        public void accept(Throwable throwable) throws Exception{
            // handle error event
        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            // handle completion - what we actually care about
        }
    });

你可能會說這里我們可以同樣用 Single 來簡化代碼,是的沒錯。在這種情況下我們仍然需要 MyData 結果,確定?服務器返回給我們更新后的數(shù)據(jù)是良好的設計,當時實際上僅僅是返回給我們之前發(fā)送給它的對象。我們真正需要的只是更新成功了,這意味著,我只關心 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() {
        @Override
        public void run() throws Exception {
            // handle completion
        }
    }, new Consumer() {
        @Override
        public void accept(Throwable throwable) throws Exception{
            // handle error
        }
    });

Completable 本質上來說和 Observable 與 Single 不一樣,因為它不發(fā)射數(shù)據(jù)。因此 Completable 的操作符也有所區(qū)別,最常用的是andThen。在這個操作符中你可以傳任何ObservableSingle、Flowable、Maybe或者其他Completable,它們會在原來的 Completable 結束后執(zhí)行。例如。你想執(zhí)行一些其他操作(Single):

apiClient.updateMyData(myUpdatedData)
    .andThen(performOtherOperation()) // a Single
    .subscribe(new Consumer() {
        @Override
        public void accept(OtherResult result) throws Exception {
            // handle otherResult
        }
    }, new Consumer() {
        @Override
        public void accept(Throwable throwable) throws Exception{
            // handle error
        }
    });

跟 Single 不同的是 RxJava 不允許直接把 Observable 轉換為 Completable,因為沒辦法知道一個 Observable 什么時候 complete。但是你可以把 Single 轉換為 Completable,因為 Single 保證 onComplete 會被調用,這個操作符是toCompletable

希望通過這篇簡短的對 Single 和 Completable 的介紹能讓你理解這兩個概念從而寫出更簡潔的代碼。


本文標題:理解RxJava中的Single和Completable
新聞來源:http://www.5511xx.com/article/dhgpije.html