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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容