1.什么是ReactiveX(下面簡(jiǎn)稱Rx)?
Rx是一個(gè)編程模型,目標(biāo)是提供一致的編程接口,幫助開發(fā)者更方便的處理異步數(shù)據(jù)流
使用Rx,開發(fā)者可以用Observables表示異步數(shù)據(jù)流,用LINQ(讀作Link)操作符查詢異步數(shù)據(jù)流, 用Schedulers參數(shù)化異步數(shù)據(jù)流的并發(fā)處理,Rx可以這樣定義:Rx = Observables + LINQ + Schedulers。
2.優(yōu)點(diǎn)
①可組合:一般Java處理有先后順序的并發(fā)請(qǐng)求的時(shí)候會(huì)涉及到嵌套回調(diào),這樣代碼就會(huì)變成一層一層的,不僅不美觀,而且也不容易維護(hù) Rx將異步調(diào)用封裝成Observable,開發(fā)者可以非常方便的在中途操作數(shù)據(jù)流
②輕松處理并發(fā):使用其Scheduler可以非常方便的切換數(shù)據(jù)流執(zhí)行的線程
3.Rx是基于觀察者模式的,觀察者就像一個(gè)哨兵,他負(fù)責(zé)訂閱觀察者對(duì)象。你可以定義一種獲取和變換數(shù)據(jù)的機(jī)制,當(dāng)數(shù)據(jù)就緒的時(shí)候,這種機(jī)制就會(huì)分發(fā)數(shù)據(jù)給觀察者哨兵。
傳統(tǒng)的方法調(diào)用模型是這樣的,你通過調(diào)用一個(gè)方法,這個(gè)方法返回一些數(shù)據(jù)給你,然后你用這個(gè)返回的數(shù)據(jù)做一些事情
但是Rx的異步模型是,【你將這個(gè)異步調(diào)用本身定義為一個(gè)Observable】,觀察者通過訂閱操作關(guān)聯(lián)到這個(gè)Observable。接下來,你可以繼續(xù)你的業(yè)務(wù)邏輯,當(dāng)方法返回的時(shí)候,Observable會(huì)發(fā)射結(jié)果,觀察者的方法就會(huì)處理結(jié)果
4.subscribe方法用于將觀察者連接到Observable,但是注意,這個(gè)方法是在Observable的調(diào)用鏈之中的,仔細(xì)想想也不難明白,因?yàn)楸挥^察者需要持有觀察者對(duì)象才能夠調(diào)用觀察者的方法來處理結(jié)果。一般來說,觀察者需要實(shí)現(xiàn)以下方法的子集:
①onNext(T item):
Observable調(diào)用這個(gè)方法發(fā)射數(shù)據(jù) 方法的參數(shù)就是Observable發(fā)射的數(shù)據(jù) 這個(gè)方法可能被調(diào)用多次 取決于具體的實(shí)現(xiàn)
②onError(Exception ex):
當(dāng)Observable遇到錯(cuò)誤或者無法返回期望的數(shù)據(jù)時(shí)會(huì)調(diào)用這個(gè)方法,這個(gè)調(diào)用會(huì)終止Observable,后續(xù)不會(huì)再調(diào)用onNext和onCompleted,onError方法的參數(shù)是拋出的異常。
③onComplete:
正常終止,如果沒有遇到錯(cuò)誤,Observable在最后一次調(diào)用onNext之后調(diào)用此方法。
5.Observables的"熱"和"冷":
一個(gè)"熱"的Observable可能一創(chuàng)建完就開始發(fā)射數(shù)據(jù),因此所有后續(xù)訂閱它的觀察者可能從序列中間的某個(gè)位置開始接受數(shù)據(jù)(有一些數(shù)據(jù)錯(cuò)過了)。
一個(gè)"冷"的Observable會(huì)一直等待,直到有觀察者訂閱它才開始發(fā)射數(shù)據(jù),因此這個(gè)觀察者可以確保會(huì)收到整個(gè)數(shù)據(jù)序列。
在一些ReactiveX實(shí)現(xiàn)里,還存在一種被稱作Connectable的Observable,不管有沒有觀察者訂閱它,這種Observable都不會(huì)開始發(fā)射數(shù)據(jù),除非Connect方法被調(diào)用。
6.ReactiveX真正強(qiáng)大的地方在于它的操作符,操作符讓你可以變換、組合、操縱和處理Observable發(fā)射的數(shù)據(jù)。
Rx的操作符讓你可以用聲明式的風(fēng)格組合異步操作序列,它擁有回調(diào)的所有效率優(yōu)勢(shì),同時(shí)又避免了典型的異步系統(tǒng)中嵌套回調(diào)的缺點(diǎn)。
下面是常用的操作符列表:
創(chuàng)建操作 Create, Defer, Empty/Never/Throw, From, Interval, Just, Range, Repeat, Start, Timer
變換操作 Buffer, FlatMap, GroupBy, Map, Scan和Window
過濾操作 Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Last, Sample, Skip, SkipLast, Take, TakeLast
組合操作 And/Then/When, CombineLatest, Join, Merge, StartWith, Switch, Zip
錯(cuò)誤處理 Catch和Retry
輔助操作 Delay, Do, Materialize/Dematerialize, ObserveOn, Serialize, Subscribe, SubscribeOn, TimeInterval, Timeout, Timestamp, Using
條件和布爾操作 All, Amb, Contains, DefaultIfEmpty, SequenceEqual, SkipUntil, SkipWhile, TakeUntil, TakeWhile
算術(shù)和集合操作 Average, Concat, Count, Max, Min, Reduce, Sum
轉(zhuǎn)換操作 To
連接操作 Connect, Publish, RefCount, Replay
反壓操作,用于增加特殊的流程控制策略的操作符