觀察者模式:當一個對象發(fā)生變化時命雀,依賴它的所有對象都會被通知并且會自動更新
RxJava是典型的觀察者模式
生產(chǎn)者在沒有更多數(shù)據(jù)可用時能夠發(fā)出信號通知:onCompleted()
事件生產(chǎn)者在發(fā)生錯誤時能夠發(fā)出信號通知onError()
事件RxJava Observables能夠組合而不是嵌套悬钳,從而避免開發(fā)者陷入回調地獄
有四種角色
1.Observable可觀察者蔚袍,即被觀察者
2.Observer觀察者
3.Subscriber訂閱事件
4.Subjects
Observables和Subjects是兩個“生產(chǎn)”實體渺贤,Observers和Subscribers是兩個“消費”實體
Observable和Observer通過subscribe()方法實現(xiàn)訂閱關系六水,從而Observable可以在需要的時候發(fā)出事件來通知Observer
RxJava的基本實現(xiàn)
一.創(chuàng)建Observer
Observer=Subscriber
除了Observer接口之外桨啃,RxJava還內置一個實現(xiàn)了Observer的抽象類:Subscriber.
Subscriber對Observer接口進行了一些擴張踩蔚,但他們的基本使用方式是完全一樣的在RxJava的subscribe過程中不瓶,Observer也總是會先被轉換成一個Subscriber再使用
1.onStart(),這是Subscriber增加的方法禾嫉,它會在subscribe剛開始,而事件還未發(fā)送之前被調用湃番,可以用于做一些準備工作夭织,例如是數(shù)據(jù)的清零或重置,如果對準備工作的線程有要求可以使用doOnSubscribe()方法吠撮。
2.unsubscribe()這是subscriber所實現(xiàn)的另一個接口Subscription的方法尊惰,用于取消訂閱在使用之前應該先用isUnsubscribed()先判斷一下狀態(tài),要及時釋放Observable持有的Subscriber的引用泥兰,不然會有內存溢出的風險
二.創(chuàng)建Observable
使用create()方法創(chuàng)建一個Observable,并為他定義事件觸發(fā)規(guī)則
Observable observable = Obserable.create(new Observable.OnSubscribe){? ?
@Override
public void call(Subscribersubscriber){
??? }
}
這里傳入了一個OnSubscribe對象作為參數(shù)弄屡,OnSubscribe會被存儲在返回的Observable對象中,他的作用相當于一個計劃表鞋诗,當Observable被訂閱的時候膀捷,OnSubscribe的call方法會自動被調用。
Observable.just(T..)將傳入的參數(shù)依次發(fā)送出來
Observable.from(T[])將傳入的數(shù)組或Iterable拆分成具體對象后削彬,依次發(fā)送出來
三.Subscribe(訂閱)
創(chuàng)建了Observable和Observer之后全庸,再用subscribe()方法將他們聯(lián)結起來秀仲,整條鏈子就可以工作了
observable.subscribe(observer)
observable.subscribe(subscriber)
observable.subscribe(Subscriber)的內部實現(xiàn)
public Subscription subscribe(Subscriber subscriber){?
? subscriber.onStart();
? onSubscribe.call(subscriber);
??? return subscriber;
}
Observable并不是在創(chuàng)建的時候就立即開始發(fā)送事件壶笼,而是在它被訂閱的時候神僵,即當subscribe()被執(zhí)行的時候將傳入的Subscriber作為Subscription返回,這是為了方便unSubscribe()
subscribe()還支持不完整定義的回調覆劈,RxJava會自動根據(jù)定義創(chuàng)建出Subscriber
Action1?? onCompletedAction = new Action1(){
//onCompleted();
@Override
public void call(){
Log.d(tag,"completed");
?? }
};
observable.subscribe(onCompletedAction);
Action0 是 RxJava 的一個接口保礼,它只有一個方法 call(),這個方法是無參無返回值的责语;由于onCompleted() 方法也是無參無返回值的炮障,因此 Action0 可以被當成一個包裝對象,將onCompleted() 的內容打包起來將自己作為一個參數(shù)傳入 subscribe() 以實現(xiàn)不完整定義的回調坤候。這樣其實也可以看做將 onCompleted() 方法作為參數(shù)傳進了 subscribe()胁赢,相當于其他某些語言中的『閉包』。