1. 程式人生 > >RxJava之前世今生(一)

RxJava之前世今生(一)

學習RxJava之前,我們可能會好奇為什麼叫做RxJava。如果你不知道ReactiveX的話,那麼你可能還真不知道什麼是Rx。

一、Rx介紹

創ReactiveX是Reactive Extensions的縮寫,一般簡寫為Rx。最初是LINQ的一個擴充套件,由微軟的架構師Erik Meijer領導的團隊開發,在2012年11月開源,Rx是一個程式設計模型,目標是提供一致的程式設計介面,幫助開發者更方便的處理非同步資料流。Rx的大部分語言庫由ReactiveX這個組織負責維護,比較流行的有RxJava/RxJS/Rx.NET,社群網站是 reactivex.io

二、什麼是ReactiveX

微軟給的定義是,Rx是一個函式庫,讓開發者可以利用可觀察序列和LINQ風格查詢操作符來編寫非同步和基於事件的程式,使用Rx,開發者可以用Observables表示非同步資料流,用LINQ操作符查詢非同步資料流, 用Schedulers引數化非同步資料流的併發處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers。

ReactiveX.io給的定義是,Rx是一個使用可觀察資料流進行非同步程式設計的程式設計介面,ReactiveX結合了觀察者模式、迭代器模式和函數語言程式設計的精華。

三、Rx模式特點

使用觀察者模式:   建立:Rx可以方便的建立事件流和資料流   組合:Rx使用查詢式的操作符組合和變換資料流   監聽:Rx可以訂閱任何可觀察的資料流並執行操作

簡化程式碼   函式式風格:對可觀察資料流使用無副作用的輸入輸出函式,避免了程式裡錯綜複雜的狀態   簡化程式碼:Rx的操作符通通常可以將複雜的難題簡化為很少的幾行程式碼   非同步錯誤處理:傳統的try/catch沒辦法處理非同步計算,Rx提供了合適的錯誤處理機制   輕鬆使用併發:Rx的Observables和Schedulers讓開發者可以擺脫底層的執行緒同步和各種併發問題

四、使用Observable的優勢

Rx擴充套件了觀察者模式用於支援資料和事件序列,添加了一些操作符,它讓你可以宣告式的組合這些序列,而無需關注底層的實現:如執行緒、同步、執行緒安全、併發資料結構和非阻塞IO。   Observable通過使用最佳的方式訪問非同步資料序列填補了這個間隙 在這裡插入圖片描述   Rx的Observable模型讓你可以像使用集合資料一樣操作非同步事件流,對非同步事件流使用各種簡單、可組合的操作。###Rx是一個多語言的實現   Rx在大量的程式語言中都有實現,並尊重實現語言的風格,而且更多的實現正在飛速增加。

五、響應式程式設計

Rx提供了一系列的操作符,你可以使用它們來過濾(filter)、選擇(select)、變換(transform)、結合(combine)和組合(compose)多個Observable,這些操作符讓執行和複合變得非常高效。   你可以把Observable當做Iterable的推送方式的等價物,使用Iterable,消費者從生產者那拉取資料,執行緒阻塞直至資料準備好。使用Observable,在資料準備好時,生產者將資料推送給消費者。資料可以同步或非同步的到達,這種方式更靈活。   下面的例子展示了相似的高階函式在Iterable和Observable上的應用:

// Iterable
getDataFromLocalMemory() 
.skip(10) 
.take(5) 
.map({ s -> return s + " transformed" }) 
.forEach({ println "next => " + it })
// Observable
getDataFromNetwork()
 .skip(10) 
.take(5)
 .map({ s -> return s + " transformed" }) 
.subscribe({ println "onNext => " + it })

Observable型別給GOF的觀察者模式添加了兩種缺少的語義,這樣就和Iterable型別中可用的操作一致了:   1、生產者可以發訊號給消費者,通知它沒有更多資料可用了(對於Iterable,一個for迴圈正常完成表示沒有資料了;對於Observable,就是呼叫觀察者的onCompleted方法)   2、生產者可以發訊號給消費者,通知它遇到了一個錯誤(對於Iterable,迭代過程中發生錯誤會丟擲異常;對於Observable,就是呼叫觀察者(Observer)的onError方法)   有了這兩種功能,Rx就能使Observable與Iterable保持一致了,唯一的不同是資料流的方向。任何對Iterable的操作,你都可以對Observable使用。

六、名詞定義

  • Reactive :反應式、響應式
  • Iterable :可迭代物件
  • Observable : 被觀察物件、被觀察者
  • Observer :觀察者物件