首页 > 代码库 > 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代码分析(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。