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 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方法

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

时间: 2024-08-03 21:05:36

guava eventbus代码分析(二)的相关文章

guava eventbus代码分析

分析guava eventbus之前,先看一下传统观察者模式的写法: Subject接口是抽象主题,相当于被观察者,它持有一个监听者observer的列表,attach方法往这个列表里面注册监听者,detach方法注销监听者,notify方法用于事件发生时通知到列表中的监听者 通常在notify的实现方法中会调用监听者的update方法. Observer是抽象观察者,带一个update方法,update方法被具体主题的notify方法调用.

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 一 图库数据管理 Gallery2的数据管理 DataManager(职责:管理数据源)- MediaSource(职责:管理数据集) - MediaSet(职责:管理数据项).DataManager中初始化所有的数据源(LocalSo

android4.0 的图库Gallery2代码分析(二)

最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http://shop108130013.taobao.com.谢谢捧场.干脆第一个回报大家的就是这个星期开始继续这篇博文吧,实在是迫于生计,无所不用其极.请谅解.今天是2013-12-31. 接下来开始摸索相册显示的流程吧. 一边摸索一边写,我想其间不乏错误的理解吧.摸索先. 相册显示相关有两个大的类别:

信息管理代码分析&lt;二&gt;读取二进制文件数据

first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while(!feof(fp))/*读取二进制文件到尾*/ { emp1=(EMP *)malloc(sizeof(EMP)); fread(emp1,sizeof(EMP),1,fp);/*读取数据*/ if(emp_first==NULL)/*链表串接*/ { emp_first=emp1; emp_end

C语言 03-第一个C程序代码分析

本文目录 一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略. 在上一篇中我们已经创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下: 1 #include <stdio.h> 2 3 in

Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习Guava EventBus(一)EventBus,我们简单的对Guava基于事件的编程进行了介绍,学习和了解了EventBus类的使用,本篇起,我们通过一系列的示例代码深入的学习EventBus类,本篇学习Guava EventBus(二)EventBus 事件订阅示例.     订阅Subscribe 首先,我们假定定义了如下所示的TradeAccountEvent类

微信公众平台开发(二) 微信公众平台示例代码分析

原文地址:http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html 一.摘要 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下. 二.获取代码 微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip 三.分析代码 完整代码如下: <?php /** * wechat php test */ //define your

WebShell代码分析溯源(二)

一.一句话变形马样本 <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST['assert']);?> 二.代码分析 1.调整代码格式 2.分析代码,首先先把”assert”字符串复制给POST数组,然后又把POST数组array数组,调试代码,搭建php环境(这里使用phpstudy) 3.发现结果输出为assert 4.这样最终一句话变形马就变成这样: <?php assert($_POST['ass

Java静态代码分析工具Infer

Java静态代码分析工具Infer 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Infer介绍 Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题.目前Facebook使用此工具分析Facebook的App,包括Android.iOS.Facebook Messenger和Instagram等. Facebook称该工具帮助其每个月检查出应用潜在的数百个Bug,例如一些空指针访问.资源