EventBus3.1用法详解

栏目: Android · 发布时间: 5年前

内容简介:EventBus是Android和Java的发布/订阅事件总线。从EventBus3.1开始支持普通Java(非android)项目。在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,EventBus3.0之后消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING)在EventBus中除了普通事件,还支持发送黏性事件,就是在发

EventBus是Android和 Java 的发布/订阅事件总线。从EventBus3.1开始支持普通Java(非android)项目。 GitHub的地址

EventBus3.1用法详解

为什么使用EventBus

  • 简化了应用程序内各组件间、组件与后台线程间的通信
  • 解耦事件发送方和接收方
  • 开销小、快、代码更优雅、体积小(~50k jar)
  • 避免复杂和容易出错的依赖关系和生命周期问题

EventBus的三要素

  • Event:事件,可以是任意类型的对象。
  • Subscriber:事件订阅者,在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync。而在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),线程模型下面会讲到。
  • Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用EventBus.getDefault().post(Object),根据post函数参数的类型,会自动调用订阅相应类型事件的函数。

EventBus的五种线程模型

  • POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
  • MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
  • BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
  • ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作
  • MAIN_ORDERED:在EventBus3.1之后新增加的,按照事件的发布顺序同步执行

EventBus常用Api

继承结构

java.lang.Object
    org.greenrobot.eventbus.EventBus
复制代码

常用方法

方法 说明
EventBus.getDefault() 获取EventBus的实例
EventBus.getDefault().register(this) 在需要的地方调用,订阅注册事件
EventBus.getDefault().post(messageEvent) 发布事件到事件总线
@Subscribe(threadMode = ThreadMode.MAIN) 指定线程模型处理事件
EventBus.getDefault().unregister(this) 取消订阅的事件

EventBus的使用,注册普通事件

添加依赖库

implementation "org.greenrobot:eventbus:3.1.1"
复制代码

自定义一个事件类

data class MessageEvent(val message:String)
复制代码

准备订阅器:声明和注释订阅方法,可选地指定线程模式

@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent){ /* Do something */ }
复制代码

在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,EventBus3.0之后消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING)

注册和取消订阅事件

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    EventBus.getDefault().register(this)
}

override fun onDestroy() {
    super.onDestroy()
    EventBus.getDefault().unregister(this)
}
复制代码

发布事件

EventBus.getDefault().post(MessageEvent("发送MessageEvent"))
复制代码

EventBus的粘性事件

在EventBus中除了普通事件,还支持发送黏性事件,就是在发送事件之后再订阅该事件也能收到该事件

订阅者处理粘性事件

@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
fun onMessageEvent(event: MessageEvent){ /* Do something */ }
复制代码

发送黏性事件

EventBus.getDefault().postSticky(MessageEvent("发送MessageEvent"))
复制代码

在需要的地方调用,订阅注册事件

EventBus.getDefault().register(this)
复制代码

ProGuard 混淆规则

-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
 
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
复制代码

参考资料


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Rework

Rework

Jason Fried、David Heinemeier Hansson / Crown Business / 2010-3-9 / USD 22.00

"Jason Fried and David Hansson follow their own advice in REWORK, laying bare the surprising philosophies at the core of 37signals' success and inspiring us to put them into practice. There's no jarg......一起来看看 《Rework》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具