RxJava
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1012/3572.html
- 優(yōu)勢(shì)
RxJava 的實(shí)現(xiàn)悄蕾,是一條從上到下的鏈?zhǔn)秸{(diào)用,沒有任何嵌套梅屉,這在邏輯的簡潔性上是具有優(yōu)勢(shì)的
- 概念及用法
觀察者模式
觀察者(observer)----------被觀察者(observable)
通過訂閱,observer知道當(dāng)observable發(fā)生變化時(shí)新的狀態(tài)或颊,對(duì)應(yīng)的就是Android的按鈕點(diǎn)擊事件:當(dāng)Button被onClick時(shí),onClickListener監(jiān)聽到該事件并產(chǎn)生相應(yīng)動(dòng)作。
- RxJava的特殊性
與傳統(tǒng)觀察者模式不同, RxJava 的事件回調(diào)方法除了普通事件 onNext() (相當(dāng)于 onClick() / onEvent())之外惫周,還定義了兩個(gè)特殊的事件:onCompleted() 和 onError()。
onCompleted(): 事件隊(duì)列完結(jié)康栈。RxJava 不僅把每個(gè)事件單獨(dú)處理递递,還會(huì)把它們看做一個(gè)隊(duì)列。RxJava 規(guī)定啥么,當(dāng)不會(huì)再有新的onNext() 發(fā)出時(shí)登舞,需要觸發(fā) onCompleted() 方法作為標(biāo)志。
onError(): 事件隊(duì)列異常悬荣。在事件處理過程中出異常時(shí)菠秒,onError() 會(huì)被觸發(fā),同時(shí)隊(duì)列自動(dòng)終止氯迂,不允許再有事件發(fā)出
在一個(gè)正確運(yùn)行的事件序列中, onCompleted() 和 onError() 有且只有一個(gè)践叠,并且是事件序列中的最后一個(gè)。
- RxJava的實(shí)現(xiàn)步驟
1.創(chuàng)建observer
(觀察者) 它決定事件觸發(fā)的時(shí)候?qū)⒂性鯓拥男袨?/p>
Observer<String> observer = new Observer<String>(){
實(shí)現(xiàn)上述所寫的三個(gè)方法
}
除了 Observer 接口之外嚼蚀,RxJava 還內(nèi)置了一個(gè)實(shí)現(xiàn)了 Observer 的抽象類:Subscriber禁灼。 Subscriber 對(duì) Observer 接口進(jìn)行了一些擴(kuò)展.
在 RxJava 的 subscribe 過程中,Observer 也總是會(huì)先被轉(zhuǎn)換成一個(gè) Subscriber 再使用驰坊。所以如果你只想使用基本功能匾二,選擇 Observer 和 Subscriber 是完全一樣的。它們的區(qū)別對(duì)于使用者來說主要有兩點(diǎn):
1.onStart(): 這是 Subscriber 增加的方法拳芙。它會(huì)在 subscribe 剛開始察藐,而事件還未發(fā)送之前
被調(diào)用,可以用于做一些準(zhǔn)備工作舟扎,例如數(shù)據(jù)的清零或重置分飞。這是一個(gè)可選方法,默認(rèn)情況下它的實(shí)
現(xiàn)為空睹限。需要注意的是譬猫,如果對(duì)準(zhǔn)備工作的線程有要求(例如彈出一個(gè)顯示進(jìn)度的對(duì)話框,這必須在
主線程執(zhí)行)羡疗, onStart() 就不適用了染服,因?yàn)樗偸窃?subscribe 所發(fā)生的線程被調(diào)用,而不能
指定線程叨恨。要在指定的線程來做準(zhǔn)備工作柳刮,可以使用 doOnSubscribe() 方法,具體見后文。
2.unsubscribe(): 這是 Subscriber 所實(shí)現(xiàn)的另一個(gè)接口 Subscription 的方法秉颗,用于取消訂閱痢毒。
在這個(gè)方法被調(diào)用后,Subscriber 將不再接收事件.一般在這個(gè)方法調(diào)用前,可使用 isUnsubscribed()
先判斷一下狀態(tài)蚕甥。 unsubscribe() 這個(gè)方法很重要哪替,因?yàn)樵?subscribe() 之后, Observable
會(huì)持有 Subscriber 的引用菇怀,這個(gè)引用如果不能及時(shí)被釋放凭舶,將有內(nèi)存泄露的風(fēng)險(xiǎn)。所以最好保持一
個(gè)原則:要在不再使用的時(shí)候盡快在合適的地方(例如 onPause() onStop() 等方法中)調(diào)用
unsubscribe() 來解除引用關(guān)系敏释,以避免內(nèi)存泄露的發(fā)生库快。
2.
3.