了解EventBus 3 0 一 訂閱流程

2021-07-23 17:43:58 字數 2150 閱讀 9550

雖然我在這裡寫下eventbus,但是,還是覺得老司機教你 「飆」 eventbus 3 才是很完美的文章。

eventbus是平常開發中很常用的框架,用了簡直愛不釋手。在這裡,以eventbus3.0 為例,來了解一下。首先了解點簡單的用法。

compile 'org.greenrobot:eventbus:3.0.0'
//註冊

eventbus.getdefault().register(this);

//解註

該方法中,有兩個重要步驟。

上面的**步驟如下:

如果沒開始索引(後面會說道)

開啟了索引

將查詢到的訂閱方法,放入cache,並返回

下面,我們來了解下findstate的這幾個方法。

看下findusingreflectioninsingleclass的相關**。

從**中可以看出,subscribermethod包含以下幾個引數

movetosuperclass 方法就簡單了。

在允許的情況下,將clazz物件置為當前clazz的父類,這樣,整個查詢方法就完成了。到這裡,查到了register類中及其父類中,所有的訂閱方法。

該方法的邏輯步驟如下:

迴圈,如果當前eventtype的列表中的,該事件的優先順序高,則插入(優先順序排序),否則,在列表末尾加入

從typesbysubscriber中獲取當前訂閱者的所有方法,如果為null,建立並插入資料

如果當前訂閱事件為粘性事件,並根據是否支援事件繼承來做一些判斷

到這裡我們就完成了訂閱的全部過程。不過,粘性事件可還沒完,當註冊了粘性事件之後,我們就會接受到以前傳送的粘性事件。我們接著看checkpoststickyeventtosubscription,這個方法只是對引數進行checknull,隨後交給posttosubscription方法處理了。

這裡的event就是我們從stickyevents拿出來的事件,這個會根據threadmode去選擇是直接反射呼叫方法,還是將事件插入佇列。我們一一看下。

可以看到,invokesubscriber方法,直接反射呼叫我們的訂閱方法來傳送事件。我們在來看另外一種,另外一種利用handlerposter#enqueue方法,插入事件,在handlerposter#handlemessage方法中,會呼叫eventbus的invokesubscriber方法,如下

哈,到這裡,整個完整的訂閱流程結束了。

EventBus3 0簡單使用

1.build.gradle新增引用 compile org.greenrobot eventbus 3.0.0 2.定義乙個事件型別 public classfirstevent publicstring getmsg 3.訂閱 解除訂閱 訂閱在oncreate中訂閱 eventbus.getde...

EventBus3 0原始碼解析

eventbus的註冊 eventbus.getdefault register this 那麼我們來看一下eventbus.getdefault 到底做了一下什麼操作 public static eventbus getdefault return defaultinstance 就是拿到了eve...

EventBus3 0 使用(非原創)

寫完上篇文章,這篇這心不想寫了,但是每週至少一篇的習慣不能改啊!雖然eventbus使用起來很簡單,但是種類特別多,比如他有粘性事件和非粘性事件,他們又都含有四種模式,並且還要測試在ui執行緒和非ui執行緒,所以情況很多種,廢話不多說繼續看。1 eventbus工具類,這裡為了使用方便寫了乙個簡單的...