RxJava2 進階之Observable 的種類及其對應的場景

前言

這篇文章主要講述一件事情,如何正確的定義我們程序中的 Observable,
下文中所有說到的信號,和我們常說的 RxJava發射的元素、Item、Error、Complete是同一類東西,但是我習慣叫它信號,在ObjectC中的Rac中也稱之爲信號

Observable 的種類

在 RxJava2 中,官方給我們定義了五種形式的[Observable]在這裏插入圖片描述

  • Observable 表示可以發射0-N個Item信號,當收到Complete信號或者Error信號結束,所以這裏就有一種可能是成功發射了若干個然後失敗,特別注意這點
  • Flowable 從之前的 Observable 中分離出來的,有Observable 的特性的同時支持背壓(後續文章會說,或者自行搜索)
  • Single 表示只會發送一個信號或者一個Error信號就結束的Observable
  • Maybe 表示只會收到一個Complete信號或者一個Item信號或者Error信號就結束的Observable
  • Completeable 表示只會收到一個Complete信號或者Error信號就結束的Observable

真實代碼中如何辨別使用哪種 Observable

其實上述幾種情況都是 RxJava幫我們定義的一些常用的類型,下面就隨便說幾種普通代碼和上面定義相符的情況

  • 迭代集合中的元素 --> Observable

由於出發點是你想要處理集合中的 Item,那麼針對的就是 集合中的 Item,而集合有多個 Item

// 就變成了一個可以發射 N 個 item 的 Observable 了
Observable observable = Observable.fromIterable(Iterable source);
// 相似方法針對數組的也有 
Observable observable = Observable.fromArray(T... items);
  • Single --> Observable

有時候我們拿到一個 Single,但是Single發射是一個集合,而我們後續想拿到集合中的元素進行操作,所以就有了下面的情況

List<String> list = new ArrayList<>();
list.add("123123");

Observable<String> observable = Single.just(list)
        .flatMapObservable(new Function<List<String>, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(List<String> strings) throws Exception {
                    return Observable.fromIterable(strings);
            }
        });

  • 網絡請求 --> Single

其實我們定義 Retrofit Api 的方法的時候,通常很多人繼承了 RxJava1 的習慣,或者壓根不知道還有 Single,又或者根本分不清用哪個.

其實很簡單,你發起一個網絡請求,你只可能會受到一個 response 或者一個錯誤(可能是超時、服務器報錯…),那麼這種情況不就是上述 RxJava2 中幫我們定義的場景嗎?它就是一個 Single

  • 普通方法 --> Single
// 從數據庫拿所有的訂單對象
public List<Order> getAllOrderFromDb() {
    // .....
}

這個也是需要使用 Single 去改爲下面的代碼,這裏有少數人就有問題了,說這裏不是一個 List對象嗎?它裏面不是有多個元素嗎?不應該使用 Observable 或者 Flowable 嗎?

注意上面的代碼的方法是隻會返回一個對象,不管這個對象是什麼,它就只可能只有一個,不能根據對象裏面還有元素去判別,如果非要用 Observable 的場景也不是沒有,看下面的示例

// 從數據庫拿所有的訂單對象
public Single<List<Order>> getAllOrderFromDb() {
    // .....
}

如果一定要和 Observable 相符的描述的話,下面的代碼非常的符合.
因爲我們它那裏有可能會得到 0-N個 Item 元素,正好符合 Observable 的描述

// 從數據庫拿所有的訂單對象
public void getAllOrderFromDb(@Nonnull Callback<Order> callback) {
    callback.accept(order1);
    callback.accept(order2);
    .....
}

還有一個情況
我們用過 RxBinding 的人應該知道,它可以把一個控件的點擊事件給轉化爲 Observable

Observable<Object> o = RxView.click(bt_commit);

爲什麼這裏就是一個 Observable,一定還是要牢記 Observable 的定義,因爲點擊事件是用戶點擊觸發的,根本不知道用戶會點擊多少次,所以這正好也符合

  • Completeable
// 取消訂單
public void cancelOrder(String orderId){
    // 去取消訂單
}

這情況下沒有返回值,方法調用成功了就表示成功結束了,如果出現異常就拋出一個異常,這種正好符合 Completeable ,類似的事情還有很多,切記 Completeable 的定義

  • FlowableMaybe

Flowable 其實多用於背壓,其他的使用場景 Observable 足以,所以平常很少用到,後續會有單獨的篇幅來介紹 Flowable 的,它的整體設計也和 Observable 有所差別

Maybe 這個操作符我平常真的沒用到過,等我用到了再來更新一下文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章