美文网首页java
EventBus - (观察者模式) 消息发布订阅类库

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

作者: 沐兮_d64c | 来源:发表于2019-01-17 20:21 被阅读202次

    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

    相关文章

      网友评论

        本文标题:EventBus - (观察者模式) 消息发布订阅类库

        本文链接:https://www.haomeiwen.com/subject/vblwdqtx.html