java

EventBus - (观察者模式) 消息发布订阅类库

2019-01-17  本文已影响202人  沐兮_d64c

1,简介

1)EventBus实现了观察者模式,是Google.Guava提供的消息发布-订阅类库。
2)Multimap:guava用于存储,一个key可以对应多个值的类。
底层使用private transient Map<K, Collection<V>> map;来实现。
3)Eventbus处理所有的事件都以串行的方式。
4)AsyncEventBus,AsyncEventBus类提供了与EventBus相同的功能,但是使用了java.util.concurrent.executor实例来进行方法的异步处理。

2,注册过程

1)使用SubscriberFindingStrategy 找到listener所有被@Subscribe修饰的方法。并构造成EventSubscriber,包含目标对象和方法,用于反射调用。放入Multimap<Class<?>, EventSubscriber>中.

image.png
2)Multimap<Class<?>, EventSubscriber>是以参数event的Class类型作为key。 image.png
3)将不同Listener生成的multimap放入subscribersByType的SetMultimap中。
image.png

3,发布过程。

1)根据eventType获取所有的Set<EventSubscriber>wrappers。
2)如果wrappers不为空,就将dispatched设置为true。

image.png
3)将每一个wrapper放入当前线程的eventToDispatch队列。
image.png
4)dispatchQueuedEvents发布消息。
从当前线程取出Queue<EventWithSubscriber> events,while循环dispatch消息。
image.png

4,调用流程

1)创建一个事件总线。

image.png
2)注册订阅者到EventBus
image.png
3)发布消息,分发消息
image.png
将所有观察者入队enqueueEvent到当前线程的ThreadLocal<Queue<EventWithSubscriber>>设置dispatched = true
image.png
4)while循环,下发消息到每一个观察者dispatchQueuedEvents()
image.png
5)使用反射处理,调用方法,传入event参数
image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读