RxJava入門實踐①

JoseBeckham 8年前發布 | 17K 次閱讀 RxJava ReactiveX Java開發

最近大家都在學習RXJAVA,作為有理想(mei shi gan)的程序員,RxJava還是沈有必要學習下的。

RXJAVA地址: https://github.com/ReactiveX/RxJava

0.什么是觀察者模式

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的交互都當做是異步的。

來自: http://blog.flyou.ren/?p=264

 本文由用戶 JoseBeckham 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!