學(xué)習(xí)RxJava之前闹获,我們可能會(huì)好奇為什么叫做RxJava璃谨。如果你不知道ReactiveX的話,那么你可能還真不知道什么是Rx。
Rx介紹
ReactiveX是Reactive Extensions的縮寫,一般簡(jiǎn)寫為Rx。最初是LINQ的一個(gè)擴(kuò)展氏涩,由微軟的架構(gòu)師Erik Meijer領(lǐng)導(dǎo)的團(tuán)隊(duì)開發(fā)饺汹,在2012年11月開源,Rx是一個(gè)編程模型缝裁,目標(biāo)是提供一致的編程接口,幫助開發(fā)者更方便的處理異步數(shù)據(jù)流粹污。Rx的大部分語言庫(kù)由ReactiveX這個(gè)組織負(fù)責(zé)維護(hù)粥航,比較流行的有RxJava/RxJS/Rx.NET缀程,社區(qū)網(wǎng)站是 reactivex.io撩满。
什么是ReactiveX
微軟給的定義是伪嫁,Rx是一個(gè)函數(shù)庫(kù),讓開發(fā)者可以利用可觀察序列和LINQ風(fēng)格查詢操作符來編寫異步和基于事件的程序,使用Rx,開發(fā)者可以用Observables表示異步數(shù)據(jù)流,用LINQ操作符查詢異步數(shù)據(jù)流, 用Schedulers參數(shù)化異步數(shù)據(jù)流的并發(fā)處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers捡硅≈缈福
ReactiveX.io給的定義是,Rx是一個(gè)使用可觀察數(shù)據(jù)流進(jìn)行異步編程的編程接口驳棱,ReactiveX結(jié)合了觀察者模式形葬、迭代器模式和函數(shù)式編程的精華猖腕。
Rx模式特點(diǎn)
使用觀察者模式:
創(chuàng)建:Rx可以方便的創(chuàng)建事件流和數(shù)據(jù)流
組合:Rx使用查詢式的操作符組合和變換數(shù)據(jù)流
監(jiān)聽:Rx可以訂閱任何可觀察的數(shù)據(jù)流并執(zhí)行操作簡(jiǎn)化代碼
函數(shù)式風(fēng)格:對(duì)可觀察數(shù)據(jù)流使用無副作用的輸入輸出函數(shù)淤年,避免了程序里錯(cuò)綜復(fù)雜的狀態(tài)
簡(jiǎn)化代碼:Rx的操作符通通撑澹可以將復(fù)雜的難題簡(jiǎn)化為很少的幾行代碼
異步錯(cuò)誤處理:傳統(tǒng)的try/catch沒辦法處理異步計(jì)算洛搀,Rx提供了合適的錯(cuò)誤處理機(jī)制
輕松使用并發(fā):Rx的Observables和Schedulers讓開發(fā)者可以擺脫底層的線程同步和各種并發(fā)問題
使用Observable的優(yōu)勢(shì)
Rx擴(kuò)展了觀察者模式用于支持?jǐn)?shù)據(jù)和事件序列,添加了一些操作符,它讓你可以聲明式的組合這些序列亮蒋,而無需關(guān)注底層的實(shí)現(xiàn):如線程趁怔、同步任连、線程安全、并發(fā)數(shù)據(jù)結(jié)構(gòu)和非阻塞IO。
Observable通過使用最佳的方式訪問異步數(shù)據(jù)序列填補(bǔ)了這個(gè)間隙
Rx的Observable模型讓你可以像使用集合數(shù)據(jù)一樣操作異步事件流,對(duì)異步事件流使用各種簡(jiǎn)單、可組合的操作。###Rx是一個(gè)多語言的實(shí)現(xiàn)
Rx在大量的編程語言中都有實(shí)現(xiàn)百匆,并尊重實(shí)現(xiàn)語言的風(fēng)格,而且更多的實(shí)現(xiàn)正在飛速增加篮迎。
響應(yīng)式編程
Rx提供了一系列的操作符,你可以使用它們來過濾(filter)、選擇(select)缩歪、變換(transform)千元、結(jié)合(combine)和組合(compose)多個(gè)Observable,這些操作符讓執(zhí)行和復(fù)合變得非常高效。
你可以把Observable當(dāng)做Iterable的推送方式的等價(jià)物,使用Iterable,消費(fèi)者從生產(chǎn)者那拉取數(shù)據(jù)衙荐,線程阻塞直至數(shù)據(jù)準(zhǔn)備好讹俊。使用Observable,在數(shù)據(jù)準(zhǔn)備好時(shí)坏挠,生產(chǎn)者將數(shù)據(jù)推送給消費(fèi)者否纬。數(shù)據(jù)可以同步或異步的到達(dá),這種方式更靈活。
下面的例子展示了相似的高階函數(shù)在Iterable和Observable上的應(yīng)用:
// 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巧涧、生產(chǎn)者可以發(fā)信號(hào)給消費(fèi)者堡称,通知它沒有更多數(shù)據(jù)可用了(對(duì)于Iterable,一個(gè)for循環(huán)正常完成表示沒有數(shù)據(jù)了;對(duì)于Observable,就是調(diào)用觀察者的onCompleted方法)
2、生產(chǎn)者可以發(fā)信號(hào)給消費(fèi)者,通知它遇到了一個(gè)錯(cuò)誤(對(duì)于Iterable餐胀,迭代過程中發(fā)生錯(cuò)誤會(huì)拋出異常;對(duì)于Observable卖擅,就是調(diào)用觀察者(Observer)的onError方法)
有了這兩種功能惩阶,Rx就能使Observable與Iterable保持一致了冬筒,唯一的不同是數(shù)據(jù)流的方向匀奏。任何對(duì)Iterable的操作蜒蕾,你都可以對(duì)Observable使用。
名詞定義
- Reactive :反應(yīng)式莺掠、響應(yīng)式
- Iterable :可迭代對(duì)象
- Observable : 被觀察對(duì)象衫嵌、被觀察者
- Observer :觀察者對(duì)象