Android-EventBus

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


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 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖 • 4 关注
  • EventBus
    4 引用 • 3 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 788 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 615 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 57 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 830 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    174 引用 • 3851 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • Outlook
    1 引用 • 5 回帖 • 3 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 4 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 410 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 2 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 10 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 3 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    58 引用 • 25 回帖 • 1 关注
  • SEO

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

    35 引用 • 200 回帖 • 31 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 47 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖 • 1 关注
  • 叶归
    6 引用 • 17 回帖 • 14 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖