鍍金池/ 教程/ Android/ Custom observables
Custom observables
Compiled functions
Reactive programming
Reservoirs and parallelism
Incrementally Agerifying legacy code
Observables and updatables
Compiled repositories
Repositories

Custom observables

Agera 可以按需自定義observable。

Proxy observables(代理被觀察者)

代理被觀察者是簡(jiǎn)單的代其他被觀察者分發(fā)通知事件,幾乎不做處理。工具類(Observables)提供了如下創(chuàng)建代理被觀察者的方法:

  • compositeObservable: 組合多觀察(事件)源;
  • conditionalObservable: 通過被觀察者設(shè)置的條件來(lái)控制事件通知;
  • perMillisecondObservable and perLoopObservable: 限制事件通知頻率。

BaseObservable

基類BaseObservable實(shí)現(xiàn)了注冊(cè)、注銷觀察者和通知給[[threading contract|Observables-and-updatables#threading]]。 繼承BaseObservable是創(chuàng)建一個(gè)自定義被觀察者的最簡(jiǎn)單的方法。 在任何線程,當(dāng)要發(fā)送事件通知的時(shí)候,子類只需要調(diào)用dispatchUpdate()方法。 舉個(gè)例子,下面的類將View的點(diǎn)擊事件實(shí)現(xiàn)為被觀察者:

public class ViewClickedObservable extends BaseObservable
    implements View.OnClickListener {

  @Override
  public void onClick(View v) {
    dispatchUpdate();
  }
}

BaseObservable的子類可以重寫observableActivated()observableDeactivated()方法,可以監(jiān)測(cè)被觀察者的激活周期,分別在激活和去激活的時(shí)候調(diào)用。

這兩個(gè)方法是在BaseObservable的線程上調(diào)用的-- 也就是實(shí)例化BaseObservable的線程。

這減輕任何同步鎖在最典型的情況下的需要,使用main Looper作為所有被觀察者的worker Looper。

UpdateDispatcher

當(dāng)不能或者不方便繼承BaseObservable的時(shí)候(比如:已經(jīng)繼承一個(gè)基類),也可以很容易的實(shí)現(xiàn)自定義被觀察者,直接實(shí)現(xiàn)Observable接口。

UpdateDispatcher實(shí)例(更新事件分發(fā)器)幫助自定義的被觀察者管理客戶端更新事件(和繼承BaseObservable一樣), 具有相同的線程規(guī)則。

自定義的被觀察者應(yīng)該創(chuàng)建一個(gè)私有更新分發(fā)器調(diào)用Observables.updateDispatcher(),或者接受ActivationHandler實(shí)例。

ActivationHandler定義了observableActivatedobservableDeactivated方法,可以監(jiān)測(cè)被觀察者的激活周期。 像BaseObservable一樣,更新分發(fā)器需要有Looper的線程上工作,所以需要在有Looper的線程上創(chuàng)建。

自定義的被觀察者應(yīng)該簡(jiǎn)單地轉(zhuǎn)發(fā)所有的注冊(cè)和注銷觀察者調(diào)用來(lái)更新。要向所有觀察者發(fā)送事件調(diào)用UpdateDispatcher.update()。 名符其實(shí),更新分發(fā)器可以方便更新,所以自定義的被觀察者自己就是一個(gè)代理,需要注冊(cè)一個(gè)內(nèi)部觀察者到其他事件源,可以簡(jiǎn)單地使用它的更新分發(fā)。

這熟悉的名字意味著更新調(diào)度是方便可更新的,因此如果自定義觀察到的是自己觀察到的一個(gè)代理,需要注冊(cè)一個(gè)內(nèi)部更新到其他事件源,它可以簡(jiǎn)單地使用它的更新調(diào)度。

一個(gè)額外的提示點(diǎn), UpdateDispatcher也是Observable的一個(gè)子類型,也可以作為被觀察者使用。就像可變r(jià)epository作為數(shù)據(jù)生產(chǎn)者和消費(fèi)者的橋梁,UpdateDispatcher作為事件生產(chǎn)者和消費(fèi)者的橋梁。

數(shù)據(jù)生產(chǎn)者使用Receiver作為MutableRepository提供數(shù)據(jù)方, 數(shù)據(jù)消費(fèi)者使用Repository作為數(shù)據(jù)消費(fèi)方。

同樣, 事件生產(chǎn)者使用Updatable作為UpdateDispatcher發(fā)送事件方, 事件消費(fèi)者使用Observable作為事件消費(fèi)方。