由浅入深了解EventBus:(一)
概述
由greenrobot织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架;
EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。EventBus分离了事件的发送者和接收者的耦合关系;它可以替代我们传统的Intent,Handler,Broadcast在Fragment,Activity,Service,线程之间传递数据,执行方法。
用法
EventBus的git地址:https://github.com/greenrobot/EventBus
在Android项目中的build.gradle中添加依赖:
compile 'org.greenrobot:eventbus:3.0.0'
1.使用EventBus首先要创建一个传递的事件类
public class MessageEvent {
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
private String message;
}
从代码中可以看出EventBus传递的事件类不需要继承任何的接口和基类,就是一个普通的java类;
2.用于EventBus内部采用的是观察者模式,因此要使用EventBus框架,首先就是要先注册/订阅事件,在EventBus框架中注册/订阅事件也非常的简单,只需要一行代码;
EventBus.getDefault().register(this);
注册方法中的this就是我们的订阅类,也就是观察者,可以是一个Fragment,Activity,Service;
3.在EventBus框架中可以注册/订阅一个事件,也可以取消注册/订阅事件,同样也很简单;
EventBus.getDefault().unregister(this);
4.在观察者模式中当被观察者发生事件后,观察者内部就有消息接收的方法,在EventBus也同样,需要在订阅类中实现我们的消息接收的方法;
@Subscribe
public void onMoonEvent(MessageEvent messageEvent){
textView.setText(messageEvent.getMessage());
}
在EventBus框架中对于观察者的消息接收方法有一定的限制,首先方法必须是Public,而且方法的参数的类型必须是我们定义的事件类;而且方法必须添加”@Subscribe“注解,因为在EventBus内部查找方法时,是根据注解来进行区分;
在消息处理方法中我们也可以终止事件的传递,后续的事件不再调用,只能在传递事件的时候调用;
EventBus.getDefault().cancelEventDelivery(event) ;
5.最后一步就是被观察者触发事件,在EventBus框架使用post(粘性事件触发使用postSticky)方法;
EventBus.getDefault().post(new MessageEvent("我是从SecondActivity 传过来的信息"));
整个EventBus框架的使用就是这么简单;关于事件类的分发中转都是EventBus框架内部进行了实现,使用者可以不用关心,只关心自己业务逻辑的实现;
由浅入深了解EventBus:(一)的更多相关文章
- 由浅入深了解EventBus:(六)
线程模型 在EventBus3.0框架中执行线程的快速切换,通过ThreadMode来指定线程在哪个线程中执行; 在EventBus3.0框架线程模型有个PendingPost 类负责数据的传递; f ...
- 由浅入深了解EventBus:(五)
事件分发 EventBus3.0的事件的分发时通过EventBus类中的post(粘性事件为postSticky)方法,post与postSticky的唯一区别就是,在postSticky内部首先会向 ...
- 由浅入深了解EventBus:(四)
事件注册 在EventBus3.0框架中订阅者对事件进行注册/订阅是通过EventBus类中的register方法来实现的,register的方法参数就是我们的订阅者的实例; public void ...
- 由浅入深了解EventBus:(三)
原理 EventBus的核心工作机制如下图 在EventBus3.0架构图: EventBus类 在EventBus3.0框架的内部,核心类就是EventBus,订阅者的注册/订阅,解除注册,以及事件 ...
- 由浅入深了解EventBus:(二)
概念 深入学习EventBus框架,就必须理解EventBus的相关原理和一些概念: Subscribe 在EventBus框架中,消息的处理接收方法必须要“@Subscribe”注解来进行标注: p ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- EventBus实现activity跟fragment交互数据
最近老是听到技术群里面有人提出需求,activity跟fragment交互数据,或者从一个activity跳转到另外一个activity的fragment,所以我给大家介绍一个开源项目,EventBu ...
- 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
随机推荐
- 将jar包发布到nexus仓库
版本的快速迭代不适合release发布到仓库,snapshot方便版本的快速迭代. 1.pom改为snapshot <dependency> <groupId>com.sf.c ...
- Ubuntu安装samba实现文件夹共享
因工作需要,准备在Ubuntu服务器上共享文件夹,从Windows和Mac上都可以访问共享文件. 搜了一下,决定通过samba服务实现.安装过程如下: [step1]安装samba服务 sudo ap ...
- HDFS数据块
磁盘也是由数据块组成的,一般默认大小是512字节,构建磁盘之上的文件系统一般是磁盘块的整数倍. HDFS也是采用块管理的,但是比较大,在Hadoop1.x中默认大小是64M,Hadoo ...
- 打印std::tuple的N总方式
方式一:递归 + 类模板特化方式 template<typename Tuple, std::size_t N> struct tuple_printer { static void pr ...
- PHP引入框架包
引入包 之后 在写代码的时候会有提示. 流程: 项目名称右击->包含目录->TAB页签选择库-> add external source folder 找到需要的包.
- presto + slider 提交计算至yarn
10.112.28.240 prestocli 10.183.225.158 perstoser hive-site.xml useUnicode=true&characterEncoding ...
- C/C++中RAND_MAX的用法
RAND_MAX是C中stdlib.h中宏定义的一个字符常量: #define RAND_MAX Ox7FFF 其值最小为32767,最大为2147483647 通常在产生随机小数时可以使用RAND_ ...
- 《面向对象的JavaScript》读书笔记
发现了2004年出版的一本好书,用两天快速刷了一遍,草草整理了一下笔记,在此备忘. 类:对象的设计蓝图或制作配方. 对象 === 实例 :老鹰是鸟类的一个实例 基于相同的类创建出许多不同的对象,类更多 ...
- MR案例:链式ChainMapper
类似于Linux管道重定向机制,前一个Map的输出直接作为下一个Map的输入,形成一个流水线.设想这样一个场景:在Map阶段,数据经过mapper01和mapper02处理:在Reduce阶段,数据经 ...
- 【前端】用javaScript实现实现一个球池的效果
ballPool 用javaScript实现实现一个球池的效果,实现效果如下所示: 动图: 截图: HTML代码: <!DOCTYPE html> <html > <he ...