详解EventBus 3.x 的快速使用
作者:ayuhani 发布时间:2021-09-04 21:00:29
EventBus 可以很方便地进行各组件间的通信,解耦性更强,比广播更好用。
EventBus 3 简介
EventBus是一种为了优化Android组件之间事件传递的解耦工具,通过发布/订阅事件总线来实现事件在不同组件之间的事件传递。
在EventBus 3之前,greenrobot团队因为考虑性能原因所以比较抵触使用注解框架。目前的EventBus3开始使用注解来申明订阅事件的处理方法。虽然目前Android 6 和ART都有了,但是对于Java反射造成的性能影响还是没能很好的解决。
在EventBus3中,greenrobot团队通过利用在编译时检索所有注解代码,然后生成一个包含所有在运行时要花很大代价才能获取的数据的类,通过这种新的注解处理方式来提升性能,让EventBus3比其他的eventbus会更加快。在后文中会贴出和otto的性能比较。
EventBus 3 和 EventBus 2.x 的区别
回调方法改动
由于API的改动,会导致EventBus3和之前使用老版本的EventBus不兼容,因为之前版本(EventBus 2.x),在注册完事件之后,会要求写相应 onEvent()方法,包括onEvent()、onEventAsync()、onEventBackground()、onEventMainThread() 分别对应 @Subscrible 、@Subscrible(threadMode = ThreadMode.ASYNC)、@Subscribe(threadMode = ThreadMode.BACKGROUND)、@Subscribe(threadMode = ThreadMode.MAIN) 。EventBus 3中在未声明threadMob时,默认的线程模式为ThreadMode.POSTING。
异常容错处理
在EventBus3中,如果在@Subscrible标注的方法中,如果程序出错,不会立即使程序crash,而是由EventBus拦截异常,并打印错误日志。
用户可以通过EventBusBuilder来配置获取EventBus实例后的对象,来决定在处理event时是否需要抛出异常信息:
eventBus = EventBus.builder().sendNoSubscriberEvent(false)
.sendSubscriberExceptionEvent(false)
.throwSubscriberException(BuildConfig.DEBUG) //只有在debug模式下,会抛出错误异常
.build();
以上代码使用Builder设计模式,来构建返回一个eventBus实例。在调试阶段,可以在程序出现异常时直接Crash发现错误。
快速使用
1. 编译
compile 'org.greenrobot:eventbus:3.1.1'
2. 自定义事件类
public class MessageEvent {
// 成员变量根据自己的需求创建
private int type;
// 通过构造方法传递数据
public MessageEvent(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
3. 注册事件与解除注册
一般来说,在 OnCreate() 方法中进行注册:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
EventBus.getDefault().register(this);
}
与之对应的,在 OnDestroy() 中解除注册:
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4. 发送事件
EventBus.getDefault().post(new MessageEvent(type));
5. 接收与处理事件
/**
* @Subscribe 注解必须要写,线程需要指定
* 方法名可随意
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
switch (event.getType()){
// do your thing
}
}
上面提到了线程模型,它一共有 5 种:
POSTING(默认): 事件处理方法的线程跟发布事件的线程是同一个线程;
MAIN:在 Android 中,事件处理方法在主线程 (UI线程) 中调用,不能进行耗时操作;
MAIN_ORDERED:在 Android 中,事件处理方法在主线程 (UI线程) 中调用。 与 MAIN 不同的是,该事件将始终排队等待发布,这确保了事件发布不会被阻塞;
BACKGROUND:在 Android 中,事件处理方法在后台线程中调用,因此不能进行 UI 操作。如果发布事件的线程是主线程 (UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程;
ASYNC:无论事件发布的线程是哪一个,事件处理方法始终会新建一个子线程运行,不能进行 UI 操作。
以上便是 EventBus 的最基本的使用,是不是很方便呢。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
来源:https://www.jianshu.com/p/90df4d613b68
猜你喜欢
- linux下的shell命令:ps -ef |grep java|grep “ ”&quo
- 前言 红包文化源远流长。从古时的红色纸包,到手
- 本篇紧接上一篇内容继续,还是从继承里的细节开始1.代码块初始化关于代码块的定义和使用因为之前已经进行过介绍,所以这里就不再赘述,我们所关注的
- 本篇文章主要介绍了java自动生成编号的实现,分享给大家,具体如下/** * 自动生成编号格式:yyMM+四位流水号 */ @Reques
- @Autowired注解和静态方法及new关系一、@autowired 与new new出来的对象无法调用@Autowired注入
- 在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。l
- 无意中在一个国外的站点下到了一个利用WCF实现聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了测试和部分修改,感觉还
- 说明本文主要配置Jackson对Long、Date、LocalDate、LocalDateTime的序列化和反序列化。由于js中整数可精确表
- 需求基于MTK8163 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加思路需求开始做之前,一定要研读SystemUI Navig
- 1.引入AOP依赖<dependency>
- Mybatis事务管理我们可以在mybatis-config.xml中配置事务管理器的实现<transactionManager ty
- import java.io.BufferedInputStream;import java.util.ArrayList;import j
- 一、概述定义一个值类型,其中包含固定值集合。枚举类型变量可以是此集合中的任意一个或多个值。枚举使用enum关键字来声明,与类同级。枚举本身可
- 如下所示:package cn.sunzn.md5;import java.security.MessageDigest;import ja
- C# 连接海康威视/// <summary> /// 海康威视SDK ///
- 这篇文章主要介绍了Java List集合排序实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 一、背景1.1、前言当我们写好代码并测试功能符合要求时,有可能每天都要执行这个程序(比如我写了一个爬虫脚本,每天定时运行获取我想看的小说更新
- 前言在Windows下JAVA用到的环境变量主要有3个,JAVA_HOME、CLASSPATH、PATH,下面来详细的介绍。JAVA_HOM
- 目录1、基本语法2、标识符(合法的变量名)3、关键字(保留字)4、注释5、Java 包5.1 package 语句5.2 import 语句
- import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pi