标签: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方法
---恢复内容结束---
标签:syn and 技术 this patch 技术分享 its 单线程 obj
原文地址:http://www.cnblogs.com/qiyu/p/7056385.html