EventBus源碼解析(一):概述
EventBus源碼解析(二):Register
EventBus源碼解析(三):Post/PostSticky
EventBus源碼解析(四):優(yōu)化-EventBusIndex
EventBus is a publish/subscribe event bus for Android and Java.eventbus是基于觀察者的模式設(shè)計的庫钮莲,能夠?qū)崿F(xiàn)對事件的分發(fā)處理传轰,也解耦了代碼。但如果忘記做注銷操作彩匕,就會造成內(nèi)存泄漏
EventBus分為四個步驟:
- (EventBusIndex)項目編譯期可以利用APT預(yù)解析帶@Subscribe的類漠烧,減少運行時分發(fā)事件的時間杏愤,但這步也是可以選擇不做的。
- (Register)注冊需要監(jiān)聽的類到EventBus里面
- (post/postSticky)任何地方都可以發(fā)布事件沽甥,事件分為兩種声邦,普通事件和sticky事件,后者主要的作用是事件發(fā)送之后新訂閱這個事件的類會拿到上一個同類型的事件
- (unregister)Register的類記得要在銷毀的地方做unregister摆舟,不然會造成內(nèi)存泄漏
其實EventBus的核心原理很簡單亥曹,用一個全局類維護觀察者模式的功能,其他加了一些優(yōu)化點:
1.通過注解的方式注冊監(jiān)聽回調(diào)方法
2.監(jiān)聽者可以設(shè)置優(yōu)先級
3.維護類許多Cache緩存解析過的數(shù)據(jù)恨诱,不用重復(fù)查找
4.添加sticky功能媳瞪,使剛注冊的對象能拿到監(jiān)聽類型前面發(fā)布過的事件
5.事件也可以通知到監(jiān)聽事件父類事件的方法
6.監(jiān)聽回調(diào)可以設(shè)置在不同線程響應(yīng)
//監(jiān)聽MessageEvent事件,在主線程響應(yīng)
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent) {
}
//監(jiān)聽StickyMessageEvent事件照宝,在主線程響應(yīng),如果之前有發(fā)布過該事件蛇受,則注冊的時候會收到
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
fun onMessageEvent(event: StickyMessageEvent) {
}
EventBus.getDefault().post(MessageEvent("123"))
EventBus.getDefault().postSticky(StickyMessageEvent("1234"))
使用方法就不在這里做具體介紹