详解EventBus 3.x 的快速使用

 更新时间:2018年02月27日 09:31:57   作者:ayuhani  
这篇文章主要介绍了详解EventBus 3.x 的快速使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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 的最基本的使用,是不是很方便呢。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android实现关机重启的方法分享

    Android实现关机重启的方法分享

    这篇文章主要介绍了Android实现关机重启的方法,需要的朋友可以参考下
    2014-02-02
  • Android如何解析异构列表

    Android如何解析异构列表

    这篇文章主要介绍了Android如何解析异构列表,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-03-03
  • Android中SoundPool的使用步骤实例

    Android中SoundPool的使用步骤实例

    今天小编就为大家分享一篇关于Android中SoundPool的使用步骤实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • android 使用kotlin 实现点击更换全局语言(中日英切换)

    android 使用kotlin 实现点击更换全局语言(中日英切换)

    这篇文章主要介绍了android kotlin 点击更换全局语言的实现方法,这里主要介绍中日英切换,需要的朋友可以参考下
    2019-11-11
  • 详解LeakCanary分析内存泄露如何实现

    详解LeakCanary分析内存泄露如何实现

    这篇文章主要为大家介绍了详解LeakCanary分析内存泄露如何实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Android逆向入门之常见Davlik字节码解析

    Android逆向入门之常见Davlik字节码解析

    Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一,本篇文章我们来详细解释常见Davlik字节码
    2021-11-11
  • Flutter事件监听与EventBus事件的应用详解

    Flutter事件监听与EventBus事件的应用详解

    EventBus的核心是基于Streams。它允许侦听器订阅事件并允许发布者触发事件,使得不同组件的数据不需要一层层传递,可以直接通过EventBus实现跨组件通讯
    2023-04-04
  • Android程序结构简单讲解

    Android程序结构简单讲解

    在本篇文章里小编给大家分享一篇关于Android程序结构的简单说明内容,有需要的朋友们跟着学习下。
    2019-02-02
  • 分析Android中线程和线程池

    分析Android中线程和线程池

    我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。在Android中,除了Thread外,扮演线程的角色有很多,如AsyncTask,IntentService和HandlerThread等等。本文将介绍Android中线程和线程池。
    2021-06-06
  • 基于Android实现的文件同步设计方案

    基于Android实现的文件同步设计方案

    随着用户对自身数据保护意识的加强,让用户自己维护自己的数据也成了独立开发产品时的一个卖点,若只针对少量的文件进行同步,则实现起来比较简单,当针对一个多层级目录同步时,情况就复杂多了,本文我分享下我的设计思路
    2023-10-10

最新评论