目前項(xiàng)目里用到了較多的eventbus來(lái)傳遞,接收收據(jù),所以今天就花了點(diǎn)時(shí)間整理了一下eventbus執(zhí)行流程
本文主要分析eventbus 里的幾個(gè)比較重要方法
1 ,eventbus.getdefault
獲取一個(gè)單例對(duì)象

2,eventbus.getdefault.register()
//獲取當(dāng)前注冊(cè)的類(lèi)
Class subscriberClass = subscriber.getClass();
獲取我們?cè)诋?dāng)前類(lèi)定義的接收eventbus方法列表
List subscriberMethods =subscriberMethodFinder.findSubscriberMethods(subscriberClass);
這個(gè)方法具體實(shí)現(xiàn)

首先 METHOD_CACHE是一個(gè) hashmap ,它里面緩存了我們已經(jīng)注冊(cè)過(guò)的的類(lèi)定義的接收方法列表,避免重復(fù)獲取
第一次進(jìn)來(lái)則會(huì)獲取我們定義的接收事件方法列表

這個(gè)方法首先是創(chuàng)建一個(gè)新的FindState類(lèi),通過(guò)兩種方法獲取,一種是從FIND_STATE_POOL即FindState池中取出可用的FindState,如果沒(méi)有的話,則通過(guò)第二種方式:直接new一個(gè)新的FindState對(duì)象。FindState類(lèi)是SubscriberMethodFinder的內(nèi)部類(lèi),這個(gè)方法主要做一個(gè)初始化的工作。這里由于初始化的時(shí)候,findState.subscriberInfo和subscriberInfoIndexes為空,所以這里會(huì)調(diào)用findUsingReflectionInSingleClass(findState);
方法,這個(gè)方法最終會(huì)獲取到我們定義接收消息類(lèi)的方法列表(主要代碼)
// This is faster than getMethods, especially when subscribers are fat classes like Activities?
,反射獲取們當(dāng)前注冊(cè)類(lèi)的自己聲明的方法列表
? ? methods = findState.clazz.getDeclaredMethods();
? //遍歷方法列表
? for (Method method : methods) {
? int modifiers = method.getModifiers();
? if ((modifiers & Modifier.PUBLIC) !=0 && (modifiers &MODIFIERS_IGNORE) ==0) {
? ? ? ? //獲取當(dāng)前方法的參數(shù)列表
????????Class[] parameterTypes = method.getParameterTypes();
? ? ? ? //這里判斷等于1 說(shuō)明我們定義的接收方法的參數(shù)只能有1個(gè)
????????if (parameterTypes.length ==1) {
? ? ? ? ? ? //獲取當(dāng)前方法是否有@subscribe 注解
????????????Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class);
????????????if (subscribeAnnotation !=null) {
? ? ????????eventType = parameterTypes[0];
????????????if (findState.checkAdd(method, eventType)) {
????????????????ThreadMode threadMode = subscribeAnnotation.threadMode();
? ? ? ? ? ? ? ? //獲取方法的threadmode等屬性,并創(chuàng)建一個(gè)SubscriberMethod 添加ArrayList中
????????????????findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode,
????????????????subscribeAnnotation.priority(), subscribeAnnotation.sticky()));
????????????}
????}
? ? ...
}
好了,我們定義的接收方法列表獲取到了,在看register接下來(lái)的邏輯

遍歷剛剛獲取的方法列表,調(diào)用subscribe方法,這是subscribe方法前半段

這段代碼主要是 以方法參數(shù)的類(lèi)型class為key,以list<subscription> 為value將其添加到subscriptionsByEventType這個(gè)hashmap中
下面的typesBySubscriber也是一個(gè)hashmap ,它是以當(dāng)前類(lèi)為key,以方法參數(shù)的類(lèi)型class為value,這個(gè)hashmap主要是判斷當(dāng)前event是否注冊(cè)

? ? ? ? 這個(gè)是subscribe方法后半部分,主要針對(duì)的是stickyevent,我們看到后面會(huì)調(diào)用checkPostStickyEventToSubscription(newSubscription, stickyEvent);這個(gè)方法,而這個(gè)方法最終會(huì)調(diào)用下面這個(gè)方法

? ? ? ? ? ? 這里說(shuō)明我們?cè)诎l(fā)送stickyevent的時(shí)候,相應(yīng)的sticky方法會(huì)在當(dāng)前類(lèi)的eventbus注冊(cè)的時(shí)候調(diào)用
? ? ? ? ? ? ?到這里eventbus注冊(cè)就執(zhí)行完了
3 eventbus.getdefault.post() ? ? ? ? ? ? ? eventbus發(fā)送消息
? ? post方法會(huì)調(diào)用 ?postSingleEvent(eventQueue.remove(0), postingState); ? ? ? ?方法,然后再調(diào)用 postSingleEventForEventType(event, postingState, eventClass);方法,再看這個(gè)方法

? ? ? 首先這個(gè)subscriptionsByEventType(hashmap)是剛剛注冊(cè)的時(shí)候保存的方法列表,獲取到我們要發(fā)送的event之后會(huì)調(diào)用postToSubscription(subscription, event, postingState.isMainThread);方法,這個(gè)方法就是去執(zhí)行subscription里的method.
自此,eventbus基本執(zhí)行流程也就結(jié)束了