Android Event Bus

了解一下 Android 處理 UI 事件的方法。 event bus 的概念是提供一個 object 作為其它 object post/receive event 的中心,大家應該都是用 singleton 取得 event bus object,再透過它配送事件。用起來有點 Mediator Pattern 的味道。

Android 有兩套 3rd-party 實作 EventBus 和 Otto,前者在自己的 benchmark 裡聲稱它全面打趴後者,功能更多速度更快。不過 Otto 的介面應該能滿足 87% 的使用情境吧。

可以的話,還是都在同一個 thread 作 post/receive 並且同步完成,這樣用起來和 iOS 的 NSNotificationCenter 滿像的。如果有什麼不得已要 async 作或是在不同 thread post/receive,由 event bus 上層的使用者自己維護 async / running thread,也不會太麻煩。從這角度來看,用 Otto 可以避免不小心把自己的程式搞得太複雜。

實際用了一下下 Otto 後,有一些體會:

  • 追加事件處理很容易,想新增 UI 元件處理同一個事件,寫個函式加個 @Subscribe 即可。
  • 針對單一功能要找出相關的程式很快。用事件當關鍵字可以濾出發事件和收事件的物件。省去一大串轉傳事件卻沒作事的物件。
  • 有多個 UI 元件會依同一個事件作出衝突的操作時,不好處理。

關於最後一點,網頁的 DOM 或 iOS / Android 的 View 的結構沒此問題。UI 元件形成樹狀結構,事件會逐層往上或往下傳遞,每個元件可以決定是否要繼續傳下去。透過階層避免衝突。

從這角度來看的話,即使有 event bus 也不能無腦地攤平全部 UI 元件直接收事件。要將有衝突的 UI 元件分好階層,只用上層元件收事件,有需要讓下層元件處理的話,再用一般的方式一個個物件轉手傳。

Like what you read? Give fcamel a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.