码迷,mamicode.com
首页 > 其他好文 > 详细

guava eventbus代码分析(二)

时间:2017-06-20 22:17:03      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:syn   and   技术   this   patch   技术分享   its   单线程   obj   

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

我们分析下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 DeadEvent
7       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代码分析(二)

标签:syn   and   技术   this   patch   技术分享   its   单线程   obj   

原文地址:http://www.cnblogs.com/qiyu/p/7056385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!