Android-EventBus使用记录

EventBus-Github
EventBus-Document

在这里插入图片描述

Android EventBus是一个Android平台的事件总线框架,简化了组件与组件之间(Activity、Fragemnt、Service…)的通信,降低他们之间的耦合。
譬如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

使用步骤

  1. 注册
  2. 构造事件类
  3. 发布事件
  4. 接收事件
  5. 注销
注册

只有当组件(订阅者)注册后,才能接受到Event

@Override
public fun onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}
构造事件类

事件可以是一个POJO,没有任何要求

open class MessageEvent
发布事件

无论何时何地发送事件,所有与该事件类型匹配的当前注册订阅者都可以接收到事件

EventBus.getDefault().post(MessageEvent("Hello everyone!"));
接收事件

以Activity为例,如果需要处理接收到的消息那么就需要创建一个订阅者方法,这个方法将会在发布事件时调用。
使用@Subscribe注解进行定义

EventBus3后可以自由选择方法名称

// 接收到MessageEvent时被调用
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
 
// 接收到SomeOtherEvent时被调用
@Subscribe
fun handleSomethingElse(SomeOtherEvent event) {
    doSomethingWith(event);
}
四种线程模型

使用注解@Subscribe是会有一个threadMode参数,它又四种线程模型可以选择

  • POSTING:默认,表示事件处理函数的线程跟发布时间的线程在同一个线程
  • MAIN:表示处理函数会在UI线程中进行,因此耗时操作就不可以在此执行
  • BACKGROUND:表示事件处理函数的线程在后台线程。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC:表示无论那个线程发布事件,都将新建一个子线程运行
注销

当当前组件不需要的时候,也可以在其生命周期结束时注销当前订阅者

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

粘性事件使用步骤

首先看看官方对粘性事件的描述

Some events carry information that is of interest after the event is posted. For example, an event signals that some initialization is complete. Or if you have some sensor or location data and you want to hold on the most recent values. Instead of implementing your own caching, you can use sticky events. So EventBus keeps the last sticky event of a certain type in memory. Then the sticky event can be delivered to subscribers or queried explicitly. Thus, you don’t need any special logic to consider already available data.

大意就是如果事件存有一些数据,整个app在运行期间可能都会用到,那么就可以使用粘性事件而不是缓存,粘性事件会将最后一个粘性事件保存在内存中。

也就是是如果使用了粘性事件,就算订阅者在事件发布后才注册的那么依旧可以获取到该事件,但是只能获取到最新的一个粘性事件

  1. 构造事件类
  2. 发布事件
  3. 接收事件
  4. 注册
  5. 解注册
构造事件

同上

发布事件

和上述用法有些许区别,需要使用postSticky()方法

EventBus.getDefault().postSticky(MessageEvent("Hello everyone!"));
接收事件
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {   
    textField.setText(event.message);
}
注册

同上

注销

同上

手动获取和删除粘性事件

手动获取

val stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent::class.java);
if(stickyEvent != null) {
    // 删除粘性事件
    EventBus.getDefault().removeStickyEvent(stickyEvent);
}

removeStickyEvent方法还有一个重载方法会返回传入类的事件
因此以上代码可以改进为

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent::class.java);
if(stickyEvent != null) {

}

练习

1.可以使用一个Activity——mainActivity用于显示数据,打开一个新的Activity在其中发送事件,更新mainActivity中的数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值