Intro To RxJava 系列教程
阿新 • • 發佈:2019-01-07
Intro To RxJava 系列教程一共四個部分,第一部分介紹了為什麼要使用 RxJava以及 RxJava的關鍵概念:
RxJava 教程第一部分:入門之 Why Rx
RxJava 教程第一部分:入門之 關鍵的類
RxJava 教程第一部分:入門之 生命週期管理
如果看完第一部分對於為什麼要使用 RxJava 和 何時使用 RxJava 還不太明白的,可以參考 RxJava 前傳:
RxJava 前傳 ①
RxJava 前傳 ②
RxJava 前傳 ③
通過第一部分,可以瞭解到 RxJava 其實主要應用了觀察者模式的理念。在 RxJava 中主要幹4件事:
一、Observable 用來生產資料並把資料丟給觀察者;
二、Observer 用來處理 Observable 生產的資料;
三、在資料從生產者到消費者的過程中,資料可以被再加工;
四、可以指定在哪個執行緒中加工資料和消費資料。
注意上面的資料不僅僅是指普通的模型資料(比如 一個數據庫中對應的表),可以是任意的事件型別,只要是和時間相關的型別都可以。比如,點選UI 上的一個按鈕觸發的事件;訪問 URL 地址返回的內容;訪問資料庫返回的資料 等。
文章第二部分主要介紹了對資料流(事件流)的一些常用的處理函式。
RxJava 教程第二部分:事件流基礎之 建立資料流
RxJava 教程第二部分:事件流基礎之 過濾資料
RxJava 教程第二部分:事件流基礎之 檢查資料
RxJava 教程第二部分:事件流基礎之 聚合
RxJava 教程第二部分:事件流基礎之 轉換資料流
這部分設計到如何建立一個數據流,也就是如何把傳統的資料或者事件轉換為 RxJava 的 Observable,比如把網路請求返回結果的功能封裝為 Observable、把點選按鈕的點選事件封裝成 Observable 。然後就是對資料流中資料的處理,比如 一個按鈕點選事件,如果使用者對一個按鈕快速的連續點選(國內的測試同學喜歡這麼幹),則在某個時間範圍內,你可能只希望處理第一次點選事件,後續的點選事件都給丟棄了;這個點選按鈕每一次點選都可以看做事件流中的一個事件,然後你可以使用一些過濾操作函式來把不符合要求的事件過濾掉,只處理你想要的資料。除了過濾操作以外,還可以檢查資料是否滿足某一個測試條件、也可以把資料流中的所有資料聚合起來、如果源來的資料流中的資料在你程式碼中無法直接使用,則你還可以把資料流中的資料轉換為另外一種型別。
文章第三部分則介紹了對資料流更高階的處理函式。
RxJava 教程第三部分:馴服資料流之 副作用
RxJava 教程第三部分:馴服資料流之 避免 monad
RxJava 教程第三部分:馴服資料流之 高階錯誤處理
RxJava 教程第三部分:馴服資料流之 組合資料流
RxJava 教程第三部分:馴服資料流之 時間平移
RxJava 教程第三部分:馴服資料流之 hot & cold Observable
RxJava 教程第三部分:馴服資料流之 自定義操作函式
如何在傳統遺留程式碼中使用 RxJava以及資料流中的錯誤處理。還介紹瞭如何把多個數據流合併起來、如果推遲資料流中資料的發射。如果 RxJava 中提供的操作函式集合還不能滿足你的要求,你還可以自定義操作函式。
文章最後一部分介紹了多執行緒相關的概念和如何在併發環境下使用。
RxJava 教程第四部分:併發 之執行緒排程
RxJava 教程第四部分:併發 之測試
RxJava 教程第四部分:併發 之意外情況處理
RxJava 教程第四部分:併發 之資料流發射太快如何辦
通常情況下,生產資料的源頭可能需要比較長的時間去執行,比如請求一個網址,獲取返回的內容。可以通過 RxJava 提供的方法把耗時的請求放到另外一個執行緒中執行。另外把資料從一種型別轉換為另外一種型別的過程可能也是很耗時的,同樣也可以指定每個操作函式在那個執行緒執行。還介紹了 如果生產資料的源,生產資料的速度很快,而消費者無法及時的處理這些資料該腫麼辦。
看完本系列教程,可以發現 RxJava 本質上只是提供了一個處理資料流的框架。
可以這樣打個比方,有個生產肥皂的機器 (Observable),該機器每隔10秒生產一塊肥皂(原始的資料),後面還有一個機器用來在肥皂上面印上公司 logo (操作函式,把一種資料轉換為另外一種資料),在後面還有一個機器用來把肥皂放到盒子中包裝起來(同樣也是一個操作函式),最後有個工人(消費者)把每盒肥皂裝箱打包。
而 RxJava 的方便之處就是把這個流程中的處理給簡化了,並且可以像使用 Builder 模式一樣串聯呼叫,使程式碼看起來更加優雅。再加上還可以指定每個操作函式執行的執行緒,使多執行緒處理更加方便。
就拿前面提到的使用者快速狂按一個按鈕的情況來說,在原生 Android 系統裡面是不認為這種情況為 bug, 比如使用原生的 Android 系統,在vpn設定介面快速點選兩次新增 vpn的按鈕,則可以看到新增 vpn 的對話方塊會開啟兩個,關閉一個還有另外一個存在。正常使用者不會這樣作業系統,就算使用者這樣操作了,多開啟一個同樣的介面其實影響也不大,使用者關閉即可。 而國內的測試同學經常會測試這個情況,大家通常情況下都是在 View onClick 的時候記錄下點選的時間,然後在 onClick 中比較前一次點選的時間和當前的時間,如果這個時間小於一個值(比如 1秒)就認為這次點選是無效的。添加了一個變數用來記錄時間並且每次點選都要比較,只是為了處理快速點選的情況。如果使用 RxJava 則就非常簡單了:
RxView.clicks(button).throttleFirst(500, TimeUnit.MILLISECONDS).subscribe(…);
只處理 500ms 內的第一次點選。 一旦你掌握了 RxJava,發現使用 Rx 的方式來思考問題和解決問題寫出的程式碼是如此的優雅。
本文出自 雲在千峰,轉載時請註明出處及相應連結。
本文永久連結: http://blog.chengyunfeng.com/?p=983