Android EventBus使用與思路總結

2021-07-06 02:07:01 字數 2384 閱讀 9524

好了,廢話一堆,下面開始簡要講解androideventbus的使用與原理。

aci或frgm oncreate時eventbus.getdefault().register(this); ondestory時eventbus.getdefault().unregister(this); this做為乙個監聽者的角色

編寫作為攜帶資料的訊息類,該類無規定,隨意編寫;編寫任意方法名的訊息類作為單一引數的方法,加註解@subscriber(有**提示,需要精準接收的使用@subscriber(tag=」xx」))

上面兩步是設定訊息監聽,該步是發訊息的地方,呼叫eventbus.getdefault().post(訊息類物件);

如果你在aci與frgm基類中統一register與unregister的方法,提供乙個方法給子類來宣告使用eventbus,使用上會更簡便,我是這樣做的

為什麼在傳送訊息post時,能將訊息精準推送到監聽方法處並執行該方法?

首先在register時,遍歷監聽類的所有方法,找到含subscriber註解的且只有乙個引數的方法,將引數的class與註解設定的tag組合成乙個物件eventtype,eventtype做為乙個key值,對應的value是乙個含有相應監聽者的copyonwritearraylist,儲存進map裡。

/**

* 查詢訂閱物件中的所有訂閱函式,訂閱函式的引數只能有乙個.找到訂閱函式之後構建subscription儲存到map中

* *@param subscriber 訂閱物件

*@return

*/public

void

findsubcribemethods(object subscriber)

class<?> clazz = subscriber.getclass();

// 查詢類中符合要求的註冊方法,直到object類

while (clazz != null && !issystemcalss(clazz.getname()))

}} // end for

// 獲取父類,以繼續查詢父類中符合要求的方法

clazz = clazz.getsuperclass();}}

/** * 按照eventtype儲存訂閱者列表,這裡的eventtype就是事件型別,乙個事件對應0到多個訂閱者.

* *@param event 事件

*@param method 訂閱方法物件

*@param subscriber 訂閱者

*/private

void

subscibe(eventtype event, targetmethod method, object subscriber)

subscription newsubscription = new subscription(subscriber, method);

if (subscriptionlists.contains(newsubscription))

subscriptionlists.add(newsubscription);

// 將事件型別key和訂閱者資訊儲存到map中

msubcribermap.put(event, subscriptionlists);

}

在post時,還是根據eventtype找到對應的監聽者物件列表,然後invoke(反射執行)監聽者的監聽方法。

/**

* 處理單個事件

* *@param eventtype

*@param aevent

*/private

void

handleevent(eventtype eventtype, object aevent)

for (subscription subscription : subscriptions)

}

handleevent即是對監聽方法反射執行

subscription.targetmethod

.invoke(subscription.subscriber

.get(), event);

簡單的說,根據訊息類的class與註解tag,儲存監聽者物件的弱引用,在post時,再找到監聽者物件,以反射方式執行相應的監聽方法(反射解耦)。

再說下訊息的執行執行緒:預設你的訊息監聽方法執行在ui執行緒中,你還可以通過註解mode指定其它兩種方式

/**

* 事件發布的執行緒模式列舉

* *@author mr******

*/public

enum threadmode

需要關注的東西差不多就上面這些了,細節方面可以閱讀androideventbus的源**,應該都比較容易讀懂。

android eventBus 例項總結

subscriber 事件訂閱者。在eventbus3.0之前我們必須定義以onevent開頭的那幾個方法,分別是onevent oneventmainthread oneventbackgroundthread和oneventasync,而在3.0之後事件處理的方法名可以隨意取,不過需要加上註解 ...

Android EventBus實現方便的訊息傳遞

eventbus能夠簡化各元件間的通訊,讓我們的 書寫變得簡單,能有效的分離事件傳送方和接收方 也就是解耦的意思 能避免複雜和容易出錯的依賴性和生命週期問題。1.引入依賴 implementation org.greenrobot eventbus 3.1.1 2.新建乙個event類代表事件 其實...

android eventBus 的簡單使用(一)

compile org.greenrobot eventbus 3.0.0 然後寫乙個 實體類用於 儲存傳遞資料和狀態值 public class eventbuscarrier public void setobject2 object object2 private object object2...