鍍金池/ 教程/ 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(代理被觀(guān)察者)

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

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

BaseObservable

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

public class ViewClickedObservable extends BaseObservable
    implements View.OnClickListener {

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

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

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

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

UpdateDispatcher

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

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

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

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

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

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

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

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

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