1. 功能介绍

AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity、Fragment、Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦合。使得我们的代码更加简洁,耦合性更低,提升我们的代码质量。

AndroidEventBus吸收了greenrobot的EventBus以及square的otto的长处,并在此基础上做出了相应的改进,使得事件总线框架更适合用户的使用习惯,也使得事件的投递更加的精准、灵活。

与EventBus、otto的差别

名称 订阅函数是否可运行在其它线程 特点
greenrobot的EventBus 使用name pattern模式,效率高,但使用不方便。

square的otto 使用注解,使用方便,但效率比不了EventBus。
AndroidEventBus 使用注解。使用方便。但效率比不上EventBus。

订阅函数支持tag(相似广播接收器的Action)使得事件的投递更加准确。能适应很多其它使用场景。

很多其它细节请參考AndroidEventBusAndroid事件总线 ( AndroidEventBus ) 开源库公布

2. 整体设计

AndroidEventBus简约整体设计大致如上图所看到的,主要分为三个部分。即EventBus、SubscriberMethodHunter、EventHandler。

EventBus负责订阅对象与事件的管理,比方注冊、注销以及公布事件等。

在初始时将某个对象注冊到EventBus中,EventBus会遍历该对象class中的全部方法,把參数数量为1且用了Subscriber注解标识的函数管理起来,以事件类型和订阅函数Subscriber的tag构建一个EventType作为一种事件类型,某个事件类型相应有一个接收者列表。当有事件公布时,EventBus会依据公布的事件类型与tag构建EventType,然后找到相应的订阅者列表,而且将这些事件投递给全部订阅者。SubscriberMethodHunter负责查找合适的EventType,而EventHandler则负责将这些订阅函数运行到相应的线程中。至此,整个事件总线的操作流程就完毕了,当然在将Activity、Fragment等组件注冊到EventBus时,不要忘了在这些对象销毁时将它们从EventBus中移除,即调用unregister方法。

3. 流程图

注冊接收者简单流程图

公布事件简单流程图

4. 具体设计

4.1 核心类具体介绍

  • EventBus : 事件总线核心类,封装了订阅对象的注冊、注销以及事件的公布、投递等,是事件总线最核心的类;
  • EventType : 事件类型对象,由事件Class类型与接收函数tag组成。用于标识一个事件类型;
  • Subscriber : Subscriber注解,作用于函数上。用于标识这个函数是一个事件订阅函数;
  • ThreadMode : 接收函数的运行线程模型,默认运行在UI线程;
  • Subscription : 一个订阅对象的封装类,含有接收对象、目标方法、线程模型;
  • TargetMethod : 目标订阅方法;
  • SubsciberMethodHunter : 订阅方法查找辅助类,依据事件对象查找符合要求的EventType列表。EventBus依据这个返回的列表来投递事件给订阅者;
  • EventHandler : 事件处理器;
  • DefaultEventHandler : 默认的事件处理器,即事件在哪个线程投递,则处理事件也在该线程;
  • UIThreadEventHandler : 事件处理在UI线程的Handler;
  • AsyncEventHandler : 事件处理在一个独立线程的Handler;
  • MatchPolicy : 事件匹配策略接口;
  • DefaultMatchPolicy : 默认的匹配策略,公布事件时,EventBus会查找參数是该事件父类的函数,而且构造相应的EventType;
  • StrictMatchPolicy : 严格的匹配策略。公布事件时仅仅查找參数类型全然匹配的订阅函数;

4.2 类关系图

5. 杂谈

事件总线的基本结构和设计都是相似的,仅仅是大家在各种feature之间做了取舍或者增强了某些功能,使之可以满足用户的具体需求。几个事件总线库的基本特点在章节1中已经粗略给出。大家可以依据自己的需求进行选择。

本篇文章我们对AndroidEventBus做了一个简单介绍。在兴许的文章中我们再进行具体介绍,敬请期待。

$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

AndroidEventBus ( 事件总线 ) 的设计与实现的更多相关文章

  1. 基于ASP.NET Core 5.0使用RabbitMQ消息队列实现事件总线(EventBus)

    文章阅读请前先参考看一下 https://www.cnblogs.com/hudean/p/13858285.html 安装RabbitMQ消息队列软件与了解C#中如何使用RabbitMQ 和 htt ...

  2. 【第一篇】学习 android 事件总线androidEventbus之sticky事件的传递

    最近再看eventbus相关代码,首先从使用开始,后期再从源码角度分析eventbus.使用Demo后期公布到github上去. 使用的框架地址:https://github.com/bboyfeiy ...

  3. 【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收

    发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3, ...

  4. 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity

    这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...

  5. 【第二篇】学习 android 事件总线androidEventbus之异步事件的传递

    1,不同Activity直接发送Ansy的事件,以及其他任何事件,必须通过 postSticky方式来进行事件的传递,而不能通过post的形式来进行传递:EventBus.getDefault().p ...

  6. Android事件总线EventBus详解

    顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...

  7. Android事件总线还能怎么玩?

    作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...

  8. SOA实践之基于服务总线的设计

    在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...

  9. Guava - EventBus(事件总线)

    Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...

随机推荐

  1. 实现推送功能APP端需要完成的工作

    推送功能简介 实现推送的流程如下: 从APP注册推送功能,到APNS服务器发送推送消息给设备,有五个步骤. 一旦推送注册完成,应用自身的服务器以provider的身份提供推送. APP端实现 在代码方 ...

  2. 【转】Windows环境下Android Studio v1.0安装教程

    原文网址:http://ask.android-studio.org/?/article/9 http://android-studio.org/index.php/docs/experience/1 ...

  3. 给Java新手的一些建议----Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  4. iOS - NSLog、UncaughtException日志保存到文件

    转:http://blog.csdn.net/marujunyy/article/details/12005767 对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment ...

  5. centos使用网易163yum源

    CentOS系统自带的更新源的速度实在是慢,为了让CentOS6使用速度更快的YUM更新源,可以选择163(网易)的更新源. 1.下载repo文件 wget http://mirrors.163.co ...

  6. SQL SERVER 实现分组合并实现列数据拼接

    需求场景: SQL SERVER 中组织的数据结构是一个层级关系,现在需要抓出每个组织节点以上的全部组织信息,数据示例如下: ADOrg_ID--------------ParentID------- ...

  7. python 本地文档查看

    本地安装Python文档本地查看,在命令行中运行: python -m pydoc -p 1234 在浏览器中访问如下链接,就可以访问到本地文档: http://localhost:1234/ 本地文 ...

  8. Centos yum源更新为阿里云

    阿里云镜像网址 http://mirrors.aliyun.com/   更新步骤 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d ...

  9. mybatis系列-13-resultMap总结

    resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用re ...

  10. Install_pygments

    安装Pygments语法高亮 On OS X Leopard, Snow Leopard 1 $ sudo easy_install Pygments Alternatively on OS X wi ...