1拌阴,簡介
1)EventBus實(shí)現(xiàn)了觀察者模式性雄,是Google.Guava提供的消息發(fā)布-訂閱類庫留拾。
2)Multimap:guava用于存儲因篇,一個key可以對應(yīng)多個值的類泞辐。
底層使用private transient Map<K, Collection<V>> map;
來實(shí)現(xiàn)。
3)Eventbus處理所有的事件都以串行的方式惜犀。
4)AsyncEventBus铛碑,AsyncEventBus類提供了與EventBus相同的功能,但是使用了java.util.concurrent.executor實(shí)例來進(jìn)行方法的異步處理虽界。
2汽烦,注冊過程
1)使用
SubscriberFindingStrategy
找到listener所有被@Subscribe
修飾的方法。并構(gòu)造成EventSubscriber莉御,包含目標(biāo)對象和方法撇吞,用于反射調(diào)用俗冻。
放入Multimap<Class<?>, EventSubscriber>
中.
image.png
2)Multimap<Class<?>, EventSubscriber>是以參數(shù)event的Class類型作為key。image.png
3)將不同Listener生成的multimap放入subscribersByType
的SetMultimap中牍颈。
image.png
3迄薄,發(fā)布過程。
1)根據(jù)eventType獲取所有的
Set<EventSubscriber>
wrappers讥蔽。
2)如果wrappers不為空,就將dispatched設(shè)置為true画机。image.png
3)將每一個wrapper放入當(dāng)前線程的eventToDispatch隊列冶伞。
image.png
4)dispatchQueuedEvents發(fā)布消息。
從當(dāng)前線程取出Queue<EventWithSubscriber>
events,while循環(huán)dispatch消息帽芽。
image.png
4删掀,調(diào)用流程
1)創(chuàng)建一個事件總線。
image.png
2)注冊訂閱者到EventBus
image.png
3)發(fā)布消息导街,分發(fā)消息
image.png
將所有觀察者入隊enqueueEvent到當(dāng)前線程的ThreadLocal<Queue<EventWithSubscriber>>
披泪,設(shè)置dispatched = true
image.png
4)while循環(huán),下發(fā)消息到每一個觀察者dispatchQueuedEvents()
image.png
5)使用反射處理搬瑰,調(diào)用方法款票,傳入event參數(shù)
image.png
image.png