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)使用
image.pngSubscriberFindingStrategy
找到listener所有被@Subscribe
修饰的方法。并构造成EventSubscriber,包含目标对象和方法,用于反射调用。
放入Multimap<Class<?>, EventSubscriber>
中.
2)Multimap<Class<?>, EventSubscriber>是以参数event的Class类型作为key。 image.png
3)将不同Listener生成的multimap放入subscribersByType
的SetMultimap中。
image.png
3,发布过程。
1)根据eventType获取所有的
image.pngSet<EventSubscriber>
wrappers。
2)如果wrappers不为空,就将dispatched设置为true。
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