以下結論基於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的值在整個註冊過程中沒有什麼區別。