首页 > 代码库 > guava eventbus代码分析(二)

guava eventbus代码分析(二)

---恢复内容开始---

我们分析下EventBus的核心方法 post方法,直接贴代码

1 public void post(Object event) {2     Iterator<Subscriber> eventSubscribers = subscribers.getSubscribers(event);3     if (eventSubscribers.hasNext()) {4       dispatcher.dispatch(event, eventSubscribers);5     } else if (!(event instanceof DeadEvent)) {6       // the event had no subscribers and was not itself a DeadEvent7       post(new DeadEvent(this, event));8     }9   }

第2行,从subscribers中得到一个事件的所有监听者subscriber列表,第4行,调用dispatcher的dispatch方法通知所有的监听者,

第7行,如果当前事件没有任何监听者,则发送一个DeadEvent用于记录日志。

我们跟进第4行的dispatch方法:

技术分享

dispatcher方法有3个实现类,主要用到的是后面两个,LegacyAsyncDispatcher,这是一个多线程分发器,PerThreadQueuedDispather,是一个单线程分发器。

其中,这个单线程分发器实际上和当前eventBus 的post方法用的是同一个线程(并没有启用新的线程),而且单线程分发器能保证事件的执行顺序和post的顺序完全一致(即广度优先遍历)

那么按照顺序来看一下这两个分发器的dispatch 方法,

LegacyAsyncDispatcher的dispatch方法:

 1 @Override 2     void dispatch(Object event, Iterator<Subscriber> subscribers) { 3       checkNotNull(event); 4       while (subscribers.hasNext()) { 5         queue.add(new EventWithSubscriber(event, subscribers.next())); 6       } 7  8       EventWithSubscriber e; 9       while ((e = queue.poll()) != null) {10         e.subscriber.dispatchEvent(e.event);11       }12     }

第3行,checkNotNull方法

---恢复内容结束---

guava eventbus代码分析(二)