Eventbus消息事件總線:
原理:發(fā)布者發(fā)布消息,通過Eventbus通知訂閱者接收消息

設(shè)計(jì)模式:觀察者模式,發(fā)布(被觀察者)--訂閱(觀察者);
知識(shí)點(diǎn):java反射,注解處理技術(shù)(annotationProcesser);
原理分析流程:用MainActivity作為例子
1.訂閱方法Subscriber;
當(dāng)在MainActivity訂閱方法的時(shí)候:

需要對(duì)方法進(jìn)行注解,設(shè)置threadMode


2.register注冊(cè);
在MainActivity中進(jìn)行注冊(cè)的時(shí)候

分析源碼:


在上面當(dāng)我們沒有使用Eventbus的注解處理器的時(shí)候,源碼會(huì)用反射去查找所有的訂閱方法:

FindSate類屬于查找訂閱方法的初始工具類,通過循環(huán)我們傳進(jìn)來的MainActivity類循環(huán)查找所有方法;

發(fā)現(xiàn)符合要求的方法Eventbus封裝成


這個(gè)方法發(fā)現(xiàn)是把所有的訂閱方法通過map存儲(chǔ),key是方法的參數(shù),值是所有訂閱方法(參數(shù)都是這個(gè)eventType);下面還有優(yōu)先級(jí)的判斷,來存儲(chǔ)在list里面的順序


這里會(huì)判斷是不是黏性事件。如果是黏性事件,會(huì)在注冊(cè)的時(shí)候直接發(fā)送訂閱;
3.post發(fā)送消息;
最終會(huì)走到這個(gè)方法

執(zhí)行method的invoke反射方法

4.接收消息;
當(dāng)我們執(zhí)行了上面invoke方法,相當(dāng)于是執(zhí)行了訂閱方法
5.反注冊(cè)。

比較重要的點(diǎn):
1.緩存策略,subscriptionByEventType,key為類type,值為類所有的訂閱方法

2.注解使用和沒用注解的區(qū)別
3.無論是否使用注解,到最后都要用到j(luò)ava反射機(jī)制。