學(xué)習(xí)RxJava之前,我們可能會(huì)好奇為什么叫做RxJava。如果你不知道ReactiveX的話,那么你可能還真不知道什么是Rx。
Rx介紹
ReactiveX是Reactive Extensions的縮寫(xiě),一般簡(jiǎn)寫(xiě)為Rx。最初是LINQ的一個(gè)擴(kuò)展,由微軟的架構(gòu)師Erik Meijer領(lǐng)導(dǎo)的團(tuán)隊(duì)開(kāi)發(fā),在2012年11月開(kāi)源,Rx是一個(gè)編程模型,目標(biāo)是提供一致的編程接口,幫助開(kāi)發(fā)者更方便的處理異步數(shù)據(jù)流。Rx的大部分語(yǔ)言庫(kù)由ReactiveX這個(gè)組織負(fù)責(zé)維護(hù),比較流行的有RxJava/RxJS/Rx.NET,社區(qū)網(wǎng)站是 reactivex.io。
什么是ReactiveX
微軟給的定義是,Rx是一個(gè)函數(shù)庫(kù),讓開(kāi)發(fā)者可以利用可觀察序列和LINQ風(fēng)格查詢操作符來(lái)編寫(xiě)異步和基于事件的程序,使用Rx,開(kāi)發(fā)者可以用Observables表示異步數(shù)據(jù)流,用LINQ操作符查詢異步數(shù)據(jù)流, 用Schedulers參數(shù)化異步數(shù)據(jù)流的并發(fā)處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers?!?br> 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)聽(tīng):Rx可以訂閱任何可觀察的數(shù)據(jù)流并執(zhí)行操作簡(jiǎn)化代碼
函數(shù)式風(fēng)格:對(duì)可觀察數(shù)據(jù)流使用無(wú)副作用的輸入輸出函數(shù),避免了程序里錯(cuò)綜復(fù)雜的狀態(tài)
簡(jiǎn)化代碼:Rx的操作符通通??梢詫?fù)雜的難題簡(jiǎn)化為很少的幾行代碼
異步錯(cuò)誤處理:傳統(tǒng)的try/catch沒(méi)辦法處理異步計(jì)算,Rx提供了合適的錯(cuò)誤處理機(jī)制
輕松使用并發(fā):Rx的Observables和Schedulers讓開(kāi)發(fā)者可以擺脫底層的線程同步和各種并發(fā)問(wèn)題
使用Observable的優(yōu)勢(shì)
Rx擴(kuò)展了觀察者模式用于支持?jǐn)?shù)據(jù)和事件序列,添加了一些操作符,它讓你可以聲明式的組合這些序列,而無(wú)需關(guān)注底層的實(shí)現(xiàn):如線程、同步、線程安全、并發(fā)數(shù)據(jù)結(jié)構(gòu)和非阻塞IO。
Observable通過(guò)使用最佳的方式訪問(wèn)異步數(shù)據(jù)序列填補(bǔ)了這個(gè)間隙

Rx的Observable模型讓你可以像使用集合數(shù)據(jù)一樣操作異步事件流,對(duì)異步事件流使用各種簡(jiǎn)單、可組合的操作。###Rx是一個(gè)多語(yǔ)言的實(shí)現(xiàn)
Rx在大量的編程語(yǔ)言中都有實(shí)現(xiàn),并尊重實(shí)現(xiàn)語(yǔ)言的風(fēng)格,而且更多的實(shí)現(xiàn)正在飛速增加。
響應(yīng)式編程
Rx提供了一系列的操作符,你可以使用它們來(lái)過(guò)濾(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類(lèi)型給GOF的觀察者模式添加了兩種缺少的語(yǔ)義,這樣就和Iterable類(lèi)型中可用的操作一致了:
1、生產(chǎn)者可以發(fā)信號(hào)給消費(fèi)者,通知它沒(méi)有更多數(shù)據(jù)可用了(對(duì)于Iterable,一個(gè)for循環(huán)正常完成表示沒(méi)有數(shù)據(jù)了;對(duì)于Observable,就是調(diào)用觀察者的onCompleted方法)
2、生產(chǎn)者可以發(fā)信號(hào)給消費(fèi)者,通知它遇到了一個(gè)錯(cuò)誤(對(duì)于Iterable,迭代過(guò)程中發(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ì)象