Android-EventBus

本贴最后更新于 3582 天前,其中的信息可能已经沧海桑田


Android-EventBus

首先,EventBus顾名思义,就是一个事件总线,简化了很多事件处理的繁琐代码,例如Handler。 
介绍分两步,一步是用例,一步是源码解析,相对于网上的教程,我的比较简单,适合初步了解。 
1、用例 
public class TestA extends Activity{


public void onCreated(Bundle savedInstanceState){
EventBus eventbus=EventBus.getDefault();
eventbus.register(this);
runtest();}

public void onEvent(FinishEvent event){ //事件 event 处理代码}

public void runtest(){ eventbus.post(new FinishEvent);}

public class FinishEvent{}

这就是一个简单的用例了,在TestA中: 
1、用EventBus.getDefault()得到EventBus对象 
2、使用register方法注册当前TestA,并在TestA中建立onEvent()方法 
3、使用post将事件FinishEvent加入到EventBus的总线上,系统将会自动执行onEvent()方法

2、下面结合源码对上述例子进行解析: 
首先我们看register(this)方法:

private synchronized void register(Object subscriber, boolean sticky, int priority) {
        List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass()); for (SubscriberMethod subscriberMethod : subscriberMethods) {
            subscribe(subscriber, subscriberMethod, sticky, priority);
        }
    }

传进来的subscriber,也就是我们的TestA对象, findSubscriberMethods(subscriber.getClass())中,是得到TestA对象中,所有类似于onEvent的方法(subscriberMethod)。 
可以看到,我们的onEvent方法,只包含了一个参数,源码中,把subscriberMethod的参数叫做EventType,所以,我们可以推断中,一个subscriber中,可以对应多个subscriberMethod,一个subscriberMethod,对应一个EventType。

接下来看register(this)中的subscribe方法,可以看到,每个subscriber的subsriberMethod都要执行一次这个函数,在这个函数里,出现了subscription(subscriber,subscribermethod),看定义函数就知道一个subscription对应着一个subscriber和一个subscriber中的一个method。这个函数就是用已有的subscriber和method产生subscription。

弄清楚subscriber,subscription,subscriberMethod和EventType的关系就很好办了,再看源码就非常之easy。接下来让我们轻松的看post函数:

public void post(Object event) {
PostingThreadState postingState = currentPostingThreadState.get(); List<Object> eventQueue = postingState.eventQueue;
        eventQueue.add(event); ............... while (!eventQueue.isEmpty()) {
                  postSingleEvent(eventQueue.remove(0), postingState);
                } ......... }

这是一部分关键代码,eventQueue很容易知道就是一个事件排队,就像收银台一样一个一个去执行。传入的是Event,也就是EventType参数。 
为什么要传入EventType参数呢? 
因为,EventBus的原理就是根据传入的EventType参数,找到所有scription中此EventType对应的subscriptionMethod,然后去执行它,也就是说,假设subsriberA和subsriberB,都含有onEvent(FinishEvent e),那么当你传入new FinishEvent()的时候,subscriberA和B的方法都会执行!看到这里是不是清楚了很多?

接下来进入postingSingleEvent(EventType e) 
代码不难,主要就是根据函数名字来选择在什么线程上执行这个函数。在例子中,subscriberMethod的名字为onEvent(),实际上,这个名字是有相关规定的,分四种,这四种分别决定了subscriberMethod对象中的一个属性—ThreadMode

  1. onEvent
  2. onEventMainThread
  3. onEventBackgroundThread
  4. onEventAsync 
    这四种的含义,字面意思上就可以理解,EventBus就讲到这里,本篇博客只适合初步了解,你可以在草稿纸上,稍微画一下subscriber,subscriberMethod,subscription,EventType之间的关系,这样会比较清晰,当然啦,如要深入了解,请点下面链接: 
    http://www.cnblogs.com/angeldevil/p/3715934.html 
    他写的比我好哈哈哈!


  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • EventBus
    4 引用 • 3 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 30 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 59 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    93 引用 • 122 回帖 • 619 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 559 关注
  • OneDrive
    2 引用 • 3 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    81 引用 • 409 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 1 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 3 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1282 回帖 • 3 关注
  • OpenCV
    15 引用 • 36 回帖 • 7 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 648 关注
  • 996
    13 引用 • 200 回帖 • 4 关注
  • Follow
    4 引用 • 12 回帖 • 1 关注
  • Visio
    1 引用 • 2 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 5 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 242 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 676 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 560 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 34 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    437 引用 • 1238 回帖 • 587 关注