Regist過程
入口就是EventBus類中的register流程了
本章會(huì)分析下注冊的大致過程肝集,以及在平常使用過程中遇到的crash的原因走芋;
EventBus注冊的流程其實(shí)很簡單冰评,就是通過反射機(jī)制找到訂閱者對象的全部方法,在利用注解來為訂閱者方法設(shè)置訂閱的參數(shù)和訂閱線程惜纸,完成訂閱者對象和訂閱方法的訂閱過程描孟;
該方法最關(guān)鍵的就是? 注釋1 和注釋 2了益兄;
注釋1戒洼,涉及到SubScriberMethodFinder這個(gè)類燕垃;
我們在EventBus初始化的過程中就已經(jīng)對SubScriberMethodFinder進(jìn)行了初始化枢劝;
該類主要提供了訂閱者對象和訂閱者方法的存儲(chǔ)以及獲取功能,就是一個(gè)訂閱者對象和它的訂閱者對象的1個(gè)管理類卜壕;
注釋1就是通過該類來查詢訂閱者對象返回它的訂閱者方法集合您旁;
如何查詢呢?往下看
ignoreGeneratedIndex這個(gè)字段 是我們在初始化EventBus的時(shí)候就可以設(shè)置的轴捎,是能提高EventBus的一種手段鹤盒,默認(rèn)ture;
無論是通過反射機(jī)制獲取還是通過index索引方式獲取,返回的都是訂閱方法的集合侦副;先不細(xì)究兩種方式的區(qū)別侦锯,下文會(huì)特別寫一篇來說明這塊;
在獲取訂閱方法的過程中會(huì)涉及到SubscribeMethod這個(gè)類秦驯,他只是1個(gè)保存訂閱方法的信息包裝類
回到注冊的主流程
在注解1 獲取到訂閱對象的全部訂閱方法后尺碰,在注解2 循環(huán)遍歷,調(diào)用subscribe完成訂閱者對象和訂閱方法的訂閱關(guān)系译隘;
接著往下看subscribe是如何完成訂閱對象和訂閱方法的訂閱關(guān)系的
Subcription只是1個(gè)保存訂閱者對象和訂閱方法信息的信息類亲桥;
subscriptionsByEventType 在EventBus初始化的時(shí)候初始化了。僅當(dāng)在subscibe的時(shí)候put值固耘;
因此在此處第一次注冊的時(shí)候subscriptions必為null;
相同對象第二次訂閱的時(shí)候就會(huì)報(bào) already registered to event 異常题篷,也就是我們平常使用過程中1個(gè)類重復(fù)訂閱時(shí)候報(bào)的錯(cuò);
注解1 可能有點(diǎn)繞厅目,我舉個(gè)栗子番枚,
typesBySubscriber的key就是TestEventParent,value就是List<Class>,里面有Event02.Class和Event01.Class
正常的注冊過程是到這就結(jié)束了;
粘性事件的注冊
在注冊訂閱者對象的時(shí)候损敷,如果檢測到粘性事件的對象池中含有該訂閱者對象户辫,則觸發(fā)postToSubscription通過反射來觸發(fā)粘性事件,具體的發(fā)射過程在EventBus的發(fā)射流程再來分析