EventBus是一個(gè)Android事件發(fā)布/訂閱框架,通過(guò)解耦發(fā)布者和訂閱者簡(jiǎn)化 Android 事件傳遞测柠。
EventBus使用簡(jiǎn)單,并將事件發(fā)布和訂閱充分解耦,從而使代碼更簡(jiǎn)潔驶沼。
本文主要從以下幾個(gè)模塊來(lái)介紹
1、EventBus使用
2、EventBus注冊(cè)源碼解析
3、EventBus事件分發(fā)解析
4印机、EventBus取消注冊(cè)解析
threadmode :方法執(zhí)行的線程
sticky:是否接受粘性事件
priority:優(yōu)先級(jí)
String str 方法接受類(lèi)型
EventBus.getDefault 是單例模式 項(xiàng)目中存在一個(gè) 適合管理訂閱者、訂閱方法
注冊(cè)過(guò)程:
首先獲取訂閱者的class對(duì)象门驾,通過(guò)SubctriberMethodFinder獲得訂閱者訂閱的事件,
返回一個(gè)SubscriberMethod的集合多柑,SubscriberMethod里面封裝著用來(lái)響應(yīng)不同線程的ThreadMode奶是,以及訂閱的事件類(lèi)型eventType,以及訂閱的優(yōu)先級(jí)priority,是否粘性事件sticky的boolean值 會(huì)得到 訂閱者的類(lèi)對(duì)象
subscriberMethodFinder.findSubscriberMethods獲取所有訂閱者的信息
SubscripeMethodFinder類(lèi)用來(lái)查找和緩存訂閱者響應(yīng)函數(shù)信息的類(lèi)竣灌,EventBus
提供了一個(gè)EventBusAnnotationProcessor
注解處理器來(lái)在編譯期通過(guò)讀取@Subscribe()
注解并解析,處理其中所包含的信息,然后生成java
類(lèi)來(lái)保存所有訂閱者關(guān)于訂閱的信息,這樣就比在運(yùn)行時(shí)使用反射來(lái)獲得這些訂閱者的信息速度要快.我們可以參考EventBus
項(xiàng)目里的EventBusPerformance這個(gè)例子,編譯后我們可以在build
文件夾里找到這個(gè)類(lèi),MyEventBusIndex 類(lèi),當(dāng)然類(lèi)名是可以自定義的.我們大致看一下生成的MyEventBusIndex
類(lèi)是什么樣的:
生成了一個(gè)靜態(tài)HashMap對(duì)象 聂沙,包含著訂閱類(lèi)的class對(duì)象,訂閱方法的訂閱線程初嘹,Sticky粘性事件的值 及汉,priority優(yōu)先級(jí),這其中保存了register的信息屯烦。
我們也可以通過(guò)EvnetBusBuilder配置將編譯生成的MyEventBusindex這個(gè)類(lèi)進(jìn)去坷随,就直接可以查找訂閱類(lèi)的信息,也可以直接通過(guò)注解方式獲取FindeSubscriperMethods獲取訂閱類(lèi)的信息驻龟。
FinderSubScripeMethods 里面的先判斷是否有緩存
然后是 判斷是使用反射形式獲取訂閱類(lèi)的信息 還是 注解方式訂閱信息
注解方式訂閱信息 就如上面所講直接將MyEventBusIndex類(lèi)的信息轉(zhuǎn)換成成SubscripeMethod的集合温眉,獲取訂閱類(lèi)相關(guān)函數(shù)的信息,反射的話 會(huì)通過(guò)FindState用來(lái)做訂閱方法的校檢與保存 并通過(guò)一個(gè)靜態(tài)數(shù)組用來(lái)保存 復(fù)用等翁狐,最后通過(guò)findUsingReflectionInSingleClass()來(lái)獲取相關(guān)訂閱方法信息
findUsingReflectionInSingleClass 類(lèi)通過(guò)反射得到方法數(shù)組 遍歷數(shù)組类溢、得到注解、實(shí)例化SubscripeMethod 并添加露懒、我們訂閱類(lèi)的所有SubscriberMethod都已經(jīng)被保存了,最后再通過(guò)getMethodsAndRelease()返回List<SubscriberMethod>至此,所有關(guān)于如何獲得訂閱類(lèi)的訂閱方法信息
4.2.3 subscribe()方法的實(shí)現(xiàn)
好的,這里我們回到4.2.1的subscribe(subscriber, subscriberMethod);中去,通過(guò)這個(gè)方法,我們就完成了注冊(cè),下面看一下subscribe()的實(shí)現(xiàn):