Agera 可以按需自定義observable。
代理被觀察者是簡單的代其他被觀察者分發(fā)通知事件,幾乎不做處理。工具類(Observables
)提供了如下創(chuàng)建代理被觀察者的方法:
compositeObservable
: 組合多觀察(事件)源;conditionalObservable
: 通過被觀察者設(shè)置的條件來控制事件通知;perMillisecondObservable
and perLoopObservable
: 限制事件通知頻率。基類BaseObservable
實現(xiàn)了注冊、注銷觀察者和通知給[[threading contract|Observables-and-updatables#threading]]。
繼承BaseObservable
是創(chuàng)建一個自定義被觀察者的最簡單的方法。
在任何線程,當(dāng)要發(fā)送事件通知的時候,子類只需要調(diào)用dispatchUpdate()
方法。
舉個例子,下面的類將View的點擊事件實現(xiàn)為被觀察者:
public class ViewClickedObservable extends BaseObservable
implements View.OnClickListener {
@Override
public void onClick(View v) {
dispatchUpdate();
}
}
BaseObservable
的子類可以重寫observableActivated()
和 observableDeactivated()
方法,可以監(jiān)測被觀察者的激活周期,分別在激活和去激活的時候調(diào)用。
這兩個方法是在BaseObservable
的線程上調(diào)用的-- 也就是實例化BaseObservable
的線程。
這減輕任何同步鎖在最典型的情況下的需要,使用main Looper作為所有被觀察者的worker Looper。
當(dāng)不能或者不方便繼承BaseObservable
的時候(比如:已經(jīng)繼承一個基類),也可以很容易的實現(xiàn)自定義被觀察者,直接實現(xiàn)Observable
接口。
UpdateDispatcher
實例(更新事件分發(fā)器)幫助自定義的被觀察者管理客戶端更新事件(和繼承BaseObservable
一樣), 具有相同的線程規(guī)則。
自定義的被觀察者應(yīng)該創(chuàng)建一個私有更新分發(fā)器調(diào)用Observables.updateDispatcher()
,或者接受ActivationHandler
實例。
ActivationHandler
定義了observableActivated
和 observableDeactivated
方法,可以監(jiān)測被觀察者的激活周期。
像BaseObservable
一樣,更新分發(fā)器需要有Looper的線程上工作,所以需要在有Looper的線程上創(chuàng)建。
自定義的被觀察者應(yīng)該簡單地轉(zhuǎn)發(fā)所有的注冊和注銷觀察者調(diào)用來更新。要向所有觀察者發(fā)送事件調(diào)用UpdateDispatcher.update()
。
名符其實,更新分發(fā)器可以方便更新,所以自定義的被觀察者自己就是一個代理,需要注冊一個內(nèi)部觀察者到其他事件源,可以簡單地使用它的更新分發(fā)。
這熟悉的名字意味著更新調(diào)度是方便可更新的,因此如果自定義觀察到的是自己觀察到的一個代理,需要注冊一個內(nèi)部更新到其他事件源,它可以簡單地使用它的更新調(diào)度。
一個額外的提示點,
UpdateDispatcher
也是Observable
的一個子類型,也可以作為被觀察者使用。就像可變repository作為數(shù)據(jù)生產(chǎn)者和消費者的橋梁,UpdateDispatcher
作為事件生產(chǎn)者和消費者的橋梁。
數(shù)據(jù)生產(chǎn)者使用Receiver
作為MutableRepository
提供數(shù)據(jù)方, 數(shù)據(jù)消費者使用Repository
作為數(shù)據(jù)消費方。
同樣, 事件生產(chǎn)者使用Updatable
作為UpdateDispatcher
發(fā)送事件方, 事件消費者使用Observable
作為事件消費方。