RxJava入門實踐①
最近大家都在學習RXJAVA,作為有理想(mei shi gan)的程序員,RxJava還是沈有必要學習下的。
RXJAVA地址: https://github.com/ReactiveX/RxJava
1.RXJAVA是什么
RXJAVA是基于ReactiveX在java上的發展和延伸,是一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫。
什么是ReactiveX
微軟給的定義是,Rx是一個函數庫,讓開發者可以利用可觀察序列和LINQ風格查詢操作符來編寫異步和基于事件的程序,使用Rx,開發者可以用Observables表示異步數據流,用LINQ操作符查詢異步數據流, 用Schedulers參數化異步數據流的并發處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers。
ReactiveX.io給的定義是,Rx是一個使用可觀察數據流進行異步編程的編程接口,ReactiveX結合了觀察者模式、迭代器模式和函數式編程的精華。
ReactiveX的應用
很多公司都在使用ReactiveX,例如Microsoft、Netflix、Github、Trello、SoundCloud。
ReactiveX宣言
ReactiveX不僅僅是一個編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言。
Rx模式
使用觀察者模式
- 創建:Rx可以方便的創建事件流和數據流
- 組合:Rx使用查詢式的操作符組合和變換數據流
- 監聽:Rx可以訂閱任何可觀察的數據流并執行操作
簡化代碼
- 函數式風格:對可觀察數據流使用無副作用的輸入輸出函數,避免了程序里錯綜復雜的狀態
- 簡化代碼:Rx的操作符通通常可以將復雜的難題簡化為很少的幾行代碼
- 異步錯誤處理:傳統的try/catch沒辦法處理異步計算,Rx提供了合適的錯誤處理機制
- 輕松使用并發:Rx的Observables和Schedulers讓開發者可以擺脫底層的線程同步和各種并發問題
使用Observable的優勢
Rx擴展了觀察者模式用于支持數據和事件序列,添加了一些操作符,它讓你可以聲明式的組合這些序列,而無需關注底層的實現:如線程、同步、線程安全、并發數據結構和非阻塞IO。
Observable通過使用最佳的方式訪問異步數據序列填補了這個間隙
單個數據 | 多個數據 | |
---|---|---|
同步 | T getData() | Iterable<T> getData() |
異步 | Future<T> getData() | Observable<T> getData() |
Rx的Observable模型讓你可以像使用集合數據一樣操作異步事件流,對異步事件流使用各種簡單、可組合的操作。
Observable可組合
對于單層的異步操作來說,Java中Future對象的處理方式是非常簡單有效的,但是一旦涉及到嵌套,它們就開始變得異常繁瑣和復雜。使用Future很難很好的組合帶條件的異步執行流程(考慮到運行時各種潛在的問題,甚至可以說是不可能的),當然,要想實現還是可以做到的,但是非常困難,或許你可以用 Future.get() ,但這樣做,異步執行的優勢就完全沒有了。從另一方面說,Rx的Observable一開始就是為組合異步數據流準備的。
Observable更靈活
Rx的Observable不僅支持處理單獨的標量值(就像Future可以做的),也支持數據序列,甚至是無窮的數據流。 Observable 是一個抽象概念,適用于任何場景。Observable擁有它的近親Iterable的全部優雅與靈活。
Observable是異步的雙向push,Iterable是同步的單向pull,對比:
事件 | Iterable(pull) | Observable(push) |
---|---|---|
獲取數據 | T next() | onNext(T) |
異常處理 | throws Exception | onError(Exception) |
任務完成 | !hasNext() | onCompleted() |
Observable無偏見
Rx對于對于并發性或異步性沒有任何特殊的偏好,Observable可以用任何方式實現,線程池、事件循環、非阻塞IO、Actor模式,任何滿足你的需求的,你擅長或偏好的方式都可以。無論你選擇怎樣實現它,無論底層實現是阻塞的還是非阻塞的,客戶端代碼將所有與Observable的交互都當做是異步的。