有關EventBus的一些問答

以下結論基於EventBus2.4.0

1.問: 註冊EventBus後,EventBus怎麼保存我們的註冊信息,這裏的註冊信息包括我們是在哪個Activity或Fragment中註冊的,註冊的事件,以及接收事件時處理的方法?

答:EventBus通過反射找到我們的事件類型和接收事件處理的方法,以及處理事件時的線程模式,封裝到一個叫SubscriberMethod的類中,然後把SubscriberMethod和當前註冊的Activity或Fragment又封裝到一個叫Subscription的類中,最後以事件類型爲key,以CopyOnWriteArrayList<Subscription>爲value放到一個HashMap中。

2.問:EventBus發送事件後,如何找到我們註冊的類,和處理的方法?

答:EventBus發送事件後,會以我們發送的事件類型爲key到一個HashMap中,找到相應的value-》CopyOnWriteArrayList<Subscription>然後遍歷該CopyOnWriteArrayList,拿到每一個Subscription,通過Subscription拿到註冊的Activity或Frament,以及SubscriberMethod,再通過SubscriberMethod拿到處理的方法,最後執行。

3.問:爲什麼要在Activity或Frament的銷燬方法中,註銷EventBus?

答:通過上面的兩個問答,大家應該知道,EventBus把我們註冊的每一個Activity或Fragment保存到了HashMap中,當我們銷燬了Activity和Fragment後,EventBus還是可以通過HashMap找到我們註冊的類,從而還會執行相應的事件處理方法,這會浪費我們的內存和影響到我們app的性能,所以,不用的時候,要及時註銷EventBus。

4.問:EventBus的四種註冊方法有什麼區別?

答:
EventBus的四種註冊方法分別爲
1. register(Object subscriber)
2. register(Object subscriber, int priority)
3. registerSticky(Object subscriber)
4. registerSticky(Object subscriber, int priority)
其實EventBus總共有五種註冊方法,還有一種是
register(Object subscriber, boolean sticky, int priority)只不過這個是private修飾的,所以我們不能直接調用。當我們調用上面四種方法時,最後都調用了第五種方法。
所以歸根結底,四種方法的區別就是priority和sticky的區別,
至於sticky的值在整個註冊過程中沒有什麼區別。

發佈了34 篇原創文章 · 獲贊 19 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章