EventBus使用总结和使用场景
一、EventBus介绍
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。传统的事件传递方式包括:Handler、BroadcastReceiver、Interface回调,相比之下EventBus的优点是代码简洁,使用简单,并将事件发布和 订阅充分解耦。
二、使用场景
刚开始接触EventBus的使用,感觉EventBus既然这么强大,可以快捷方便的进行各组件之间的消息传递,那是不是就完全可以取代Intent、BroadcastReceiver、Handler等方式了。后来查了许多资料发现其实不是的,它也有很多限制。
1、Event会根据传递的参数给所有接收者都传递消息,这就导致如果你想给指定一个类里发布消息就得自己写一个接口类,要不然就会好多执行者都会执行该方法,所以一般能用Intent组件传值时还是用Intent。
2、EventBus相对于BroadCast,广播是相对消耗时间、空间最多的一种方式,但是大家都知道,广播是四大组件之一,许多系统级的事件都是通过广播来通知的,比如说网络的变化、电量的变化,短信发送和接收的状态,所以,如果与android系统进行相关的通知,还是要选择本地广播;在BroadcastReceiver的 onReceive方法中,可以获得Context 、intent参数,这两个参数可以调用许多的sdk中的方法,而eventbus获得这两个参数相对比较困难。
3、EventBus相对于handler,可以实现handler的方式,但是也会面对有许多接收者的问题,所以如果是线程回调的话,我觉得还是用handler比较好。
4、使用场景总结:所以EventBus最好的使用方式就是替代某些BroadcastReceiver和Interface;如fragment之间进行通信,用广播和接口都比较麻烦,而用EventBus则比较简单。
三、具体使用方法
1、EventBus的四种线程模型(ThreadMode)
POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起应用程序无响应(ANR)。
MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
2、基本使用
自定义一个事件类
public class AnyEventType {public AnyEventType(){}}
在要接受消息的页面注册
EventBus.getDefault().register(this);
接收消息的方法
@Subscribe
public void onEvent(AnyEventType event) {/* Do something */};
发送消息
EventBus.getDefault().post(event);
取消注册
EventBus.getDefault().unregister(this);
传递的值可自定义class,也可传递字符串,EventBus会根据传递的类型判断都有哪些接收者接收,如果有多个方法,则传递给所有接收者。
3、粘性事件
之前说的使用方法,都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。
普通的事件我们通过post发送给EventBus,发送过后之后当前已经订阅过的方法可以收到。但是如果有些事件需要所有订阅了该事件的方法都能执行呢?例如一个Activity,要求它管理的所有Fragment都能执行某一个事件,但是当前我只初始化了3个Fragment,如果这时候通过post发送了事件,那么当前的3个Fragment当然能收到。但是这个时候又初始化了2个Fragment,那么我必须重新发送事件,这两个Fragment才能执行到订阅方法。
粘性事件就是为了解决这个问题,通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。
构造发送信息类:
public class StickyEvent {public String msg;public StickyEvent(String msg) {this.msg = msg;}
}
发布消息:EventBus.getDefault().postSticky(new StickyEvent(“我是粘性事件”));
接收消息:和之前的方法一样,只是多了一个 sticky = true 的属性。
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(StickyEvent event){tv_c_result.setText(event.msg);
}
1
2
3
4
注册:
EventBus.getDefault().register(CActivity.this);
1
解注册:
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(CActivity.class);
EventBus使用总结和使用场景相关推荐
- java actor akka_Actor 模型及Akka简介
Actor 模型 Actor 的基础就是消息传递,一个 Actor 可以认为是一个基本的计算单元,它能接收消息并基于其执行运算,它也可以发送消息给其他 Actor.Actors 之间相互隔离,它们之间 ...
- Actor 模型及Akka简介
Actor 模型 Actor 的基础就是消息传递,一个 Actor 可以认为是一个基本的计算单元,它能接收消息并基于其执行运算,它也可以发送消息给其他 Actor.Actors 之间相互隔离,它们之间 ...
- 翟佳:高可用、强一致、低延迟——BookKeeper的存储实现
分享嘉宾:翟佳 StreamNative 联合创始人 编辑整理:张晓伟 美团点评 出品平台:DataFunTalk 导读:多数读者们了解BookKeeper是通过Pulsar,实际上BookKeepe ...
- 博文推荐|BookKeeper - Apache Pulsar 高可用 / 强一致 / 低延迟的存储实现
本文转自:DataFunTalk,分享嘉宾:翟佳,StreamNative 联合创始人 编辑整理:张晓伟 美团点评 导读:多数读者们了解 BookKeeper 是通过 Pulsar,实际上 BookK ...
- 2020面试美团的朋友看过来,牛客网搜集整理2018—2020美团面筋需要的自行领取
美团一面: 自我介绍 学校课程 计网:OSI七层模型 应用层协议了解多少 DNS和Http在什么层 TCP.UDP区别 一般在什么层操作 学校学过的语言 Java三大特性 怎么体现多态 private ...
- 【设计模式】观察者模式:一个注册功能也能使用到设计模式?
人生在世如身处荆棘之中,心不动,人不妄动,不动则不伤,如心动则人妄动,伤其身,痛其骨,于是体会到世间诸般痛苦 目录 我的斗罗梦 悲催的小明 什么是观察者模式? 注册功能改造 异步非阻塞观察者模式 Ev ...
- EventBus如何使用及一些常见场景
目前网上有很多的eventbus的教程,本身eventbus使用也比较简单,也没有难以理解的地方,所以我就不多提入门教程了.讲几个场景,使用eventbus后可以使项目更简单,便于快速开发功能. 至于 ...
- Android 源码分析之 EventBus 的源码解析
1.EventBus 的使用 1.1 EventBus 简介 EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus. ...
- Android各组件/控件间通信利器之EventBus
实际项目开发过程中,经常遇到如下场景:不同的应用程序组件的控件间具有一定的相 互关联性,其中用户对后者进行的某种操作会引起前者的相应改变.举一个具体的场景:以糗事百科为例,在糗事列表页和详情页页,对于 ...
最新文章
- 基于javaGUI的文档识别工具制作
- 在vc6控制台程序中如何调用运行ImageMagick命令行工具
- jquery通过ajax向后台发送(checkbox)数组,并在后台接收,(发送的数据是checkedbox)...
- 《面向对象的思考过程(原书第4版)》一1.11 组合
- HDU嵌入式实验课程大作业分析报告
- ubuntu下安装psycopg2报错
- 【hortonworks/registry】registry 如何添加新的类型 支持 json
- Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
- Android Studio禁止混淆JNI代码
- 关于HTML(十)-------怎么提升网站页面打开加载速度优化
- Ivy Bridge处理器
- Bongiovi DPS for Mac - 优秀的声音增强软件
- C/C++——黑客数字雨特效
- 南方cass提取坐标生成表格_如何利用EXCEL随机生成测量点坐标导入南方CASS中计算土方量...
- 电流转电压的multisim仿真电路图
- python输入按逗号分开_python print 按逗号或空格分隔的方法
- c语言字符串删除元音字母,C语言:写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出...
- android apk 微信登入_微信第三方登录(Android 实现)
- springboot班级同学录网站
- Angular7入门辅助教程(一)——Angular模块