详解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 种:

  1. POSTING(默认): 事件处理方法的线程跟发布事件的线程是同一个线程;

  2. MAIN:在 Android 中,事件处理方法在主线程 (UI线程) 中调用,不能进行耗时操作;

  3. MAIN_ORDERED:在 Android 中,事件处理方法在主线程 (UI线程) 中调用。 与 MAIN 不同的是,该事件将始终排队等待发布,这确保了事件发布不会被阻塞;

  4. BACKGROUND:在 Android 中,事件处理方法在后台线程中调用,因此不能进行 UI 操作。如果发布事件的线程是主线程 (UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程;

  5. ASYNC:无论事件发布的线程是哪一个,事件处理方法始终会新建一个子线程运行,不能进行 UI 操作。

以上便是 EventBus 的最基本的使用,是不是很方便呢。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

来源:https://www.jianshu.com/p/90df4d613b68

标签:EventBus,使用
0
投稿

猜你喜欢

  • Android通过ExifInterface判断Camera图片方向的方法

    2023-02-02 18:43:38
  • Java List分页功能实现代码实例

    2022-06-02 13:56:14
  • Java maven三种仓库,本地仓库,私服,中央仓库的配置

    2023-04-13 12:05:17
  • 全面解析JTA 深度历险

    2022-04-17 10:58:43
  • JavaFX实现简单日历效果

    2023-05-16 08:43:30
  • C#中实现任意List的全组合算法代码

    2022-09-23 01:06:48
  • 深入浅析Java Object Serialization与 Hadoop 序列化

    2023-07-30 17:02:16
  • springBoot解决static和@Component遇到的bug

    2022-12-31 01:23:27
  • java list去重操作实现方式

    2021-09-22 13:26:08
  • Java查找不重复无序数组中是否存在两个数字的和为某个值

    2023-08-22 16:44:40
  • C#不重复输出一个数组中所有元素的方法

    2022-07-02 14:25:58
  • C#中子类调用父类的实现方法

    2023-08-17 09:09:52
  • C# 实现FTP上传资料的示例

    2023-10-31 21:19:40
  • Java8新特性之接口中的默认方法和静态方法详解

    2022-05-10 15:16:19
  • Java实现斗地主最简代码实例

    2023-07-11 18:40:02
  • Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

    2021-09-27 15:12:59
  • Java IO异常如何处理详析

    2023-12-04 21:51:29
  • C#监控文件夹变化的方法

    2023-03-26 09:39:38
  • C#实现简单的计算器小功能

    2023-05-13 06:46:11
  • 基于Spring@Autowired注解与自动装配详谈

    2022-01-14 09:38:49
  • asp之家 软件编程 m.aspxhome.com