事件匯流排EventBus和觀察者模式

周雲鋒_2018發表於2018-09-06

前段時間有點忙,沒有更新Blog感覺學到的東西應該及時總結。畢竟,程式設計師要做的事情太多了,害怕自己忘記了,以後面試慌亂,所以,及時總結所看的每一個小的知識點,希望大家也可以更加厲害,未來一片輝煌。

下面開始介紹EventBus和觀察者模式

一:目前EventBus最新版本是3.0,本文基於3.0編寫的。

GitHub : github.com/greenrobot/…
官方文件:greenrobot.org/eventbus/do…

1.1 EventBus概述

EventBus 是一個 Android 事件釋出/訂閱框架,通過解耦釋出者和訂閱者簡化 Android 事件傳遞,這裡的事件可以理解為訊息,本文中統一稱為事件。事件傳遞既可用於 Android 四大元件間通訊,也可以使用者非同步執行緒和主執行緒間通訊等等。
傳統的事件傳遞方式包括:Handler、BroadCastReceiver、Interface 回撥,相比之下 EventBus 的優點是程式碼簡潔,使用簡單,並將事件釋出和訂閱充分解耦。

1.2 概念

事件(Event):又可稱為訊息,本文中統一用事件表示。其實就是一個物件,可以是網路請求返回的字串,也可以是某個開關狀態等等。事件型別(EventType)指事件所屬的 Class。
事件分為一般事件和 Sticky 事件,相對於一般事件,Sticky 事件不同之處在於,當事件釋出後,再有訂閱者開始訂閱該型別事件,依然能收到該型別事件最近一個 Sticky 事件。

訂閱者(Subscriber):訂閱某種事件型別的物件。當有釋出者釋出這類事件後,EventBus 會執行訂閱者的 onEvent 函式,這個函式叫事件響應函式。訂閱者通過 register 介面訂閱某個事件型別,unregister 介面退訂。訂閱者存在優先順序,優先順序高的訂閱者可以取消事件繼續向優先順序低的訂閱者分發,預設所有訂閱者優先順序都為 0。

釋出者(Publisher):釋出某事件的物件,通過 post 介面釋出事件。

1.3   訂閱者、釋出者、EventBus 關係圖

  • eventbus img

    官方提供的關係圖

2:EventBus的使用:

a:  Subscriber需要註冊(注意點:@Subscribe(threadMode = ThreadMode.MAIN)必須寫,其次方法必須

是public,否則會報錯);

b:  ThreadMode 共有四類:

  1. PostThread:預設的 ThreadMode,表示在執行 Post 操作的執行緒直接呼叫訂閱者的事件響應方法,不論該執行緒是否為主執行緒(UI 執行緒)。當該執行緒為主執行緒時,響應方法中不能有耗時操作,否則有卡主執行緒的風險。適用場景:對於是否在主執行緒執行無要求,但若 Post 執行緒為主執行緒,不能耗時的操作
  2. MainThread:在主執行緒中執行響應方法。如果釋出執行緒就是主執行緒,則直接呼叫訂閱者的事件響應方法,否則通過主執行緒的 Handler 傳送訊息在主執行緒中處理——呼叫訂閱者的事件響應函式。顯然,MainThread類的方法也不能有耗時操作,以避免卡主執行緒。適用場景:必須在主執行緒執行的操作
  3. BackgroundThread:在後臺執行緒中執行響應方法。如果釋出執行緒不是主執行緒,則直接呼叫訂閱者的事件響應函式,否則啟動唯一的後臺執行緒去處理。由於後臺執行緒是唯一的,當事件超過一個的時候,它們會被放在佇列中依次執行,因此該類響應方法雖然沒有PostThread類和MainThread類方法對效能敏感,但最好不要有重度耗時的操作或太頻繁的輕度耗時操作,以造成其他操作等待。適用場景:
    操作輕微耗時且不會過於頻繁
    ,即一般的耗時操作都可以放在這裡;
  4. Async:不論釋出執行緒是否為主執行緒,都使用一個空閒執行緒來處理。和BackgroundThread不同的是,Async類的所有執行緒是相互獨立的,因此不會出現卡執行緒的問題。適用場景:
    長耗時操作,例如網路訪問。

c:  Publisher根據自己的需要傳送Sticky事件和一般事件。


以上是我使用了EventBus的一些心得體會,很多地方沒有很全面,希望大家見諒。


觀察者模式

1.1 觀察者模式簡單介紹

觀察者模式又被稱作釋出/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。

2.1 觀察者模式的使用

使用了EventBus之後,感覺之前使用觀察者模式真的很浪費時間,需要自己封裝。但是,也有一些關鍵點或者EventBus不具備的好處。下面來簡單介紹一下:

1:觀察這模式和EventBus的理念我覺得差不多。都是需要訂閱時間,釋出者釋出資訊,訂閱者及時更新資訊。

2:觀察者模式的好處我哦感覺就是更加靈活,可以根據自己的需要定製屬於自己業務的介面(subcribe)。在Activity、fragment、service裡面沒有任何限制,完全解耦。


以上是我對於觀察者模式的理解,更多的知識點由於本人不善言表沒寫出來,大家遇到這方面的問題希望及時和我溝通,我使用觀察者模式已經有差不多一年半的時間了。所以,希望大家可以及時和我交流溝通,共同進步。


注:EventBus 所有學習資源來自 http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90,僅供學習,如有侵權,請告知,及時刪除。





相關文章