EventBus的使用

EventBus是一个Android事件总线库,它简化了组件间的通信。通过观察者模式,EventBus负责事件的发布和订阅。开发者需要在合适的时候注册和反注册订阅者,订阅者方法需用@Subscribe注解。文章介绍了EventBus的依赖添加、事件创建、线程模式(POSTING,MAIN,BACKGROUND,ASYNC)、事件优先级以及粘性事件的使用。虽然高效,但忘记反注册可能导致内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EventBus的使用

EventBus是基于观察者模式,有两种角色,一种是事件订阅者,一种是事件的发布者,EventBus的作用就是事件的搬运工,把事件从发布者传递给事件的订阅者。

1、添加依赖

implementation 'org.greenrobot:eventbus:3.1.1'

2、创建事件

public class eventBusEvent1 {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}

3、注册和反注册

如果在Activity中注册和反注册,可以在onCreate()或者onStart()中注册,在onStop()或者onDestroy()中反注册。

在Fragment中,可以在onCreate()中注册,在onDestory()中反注册,也可以在onCreateView()中注册,在onDestroyView()中反注册。

在自定义的控件中,可以在onAttachedToWindow中注册,在onDetachedFromWindow中反注册。

注册:

@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

反注册:

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

4、订阅事件和线程模式

注册完成之后,就可以声明订阅事件的方法了,方法必须是public的,并且用@Subcribe来修饰,参数为想要订阅的事件,在声明中可以指定线程模式(threadMode),线程模式可以配置订阅方法在哪个线程中执行。如果不适用threadMode来指定,默认线程模型为POSTING。

(1)POSTING线程模型:在哪个线程发布事件,就在哪个线程执行onPostingEvent方法。

@Subscribe(threadMode = ThreadMode.POSTING)
public void setTv_show(eventBusEvent1 eventBusEvent1){
    tv_show.setText(eventBusEvent1.getStr());
}

(2)MAIN线程模型:不管是哪个线程发布事件,都在主线程执行onMainEvent方法。

@Subscribe(threadMode = ThreadMode.MAIN)
public void setTv_show(eventBusEvent1 eventBusEvent1){
    tv_show.setText(eventBusEvent1.getStr());
}

(3)BACKGROUND线程模型:时间如果在子线程发布,onBackgroundEvent方法就在该子线程执行,事件如果在主线程中发布,onBackGroundEvent方法就在EventBus内部的线程池中执行。

@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void setTv_show(eventBusEvent1 eventBusEvent1){
    tv_show.setText(eventBusEvent1.getStr());
}

(4)ASYNC线程模型:不管事件是在哪个线程发布,onAsyncEvent方法都在EventBus内部的线程池中执行

@Subscribe(threadMode = ThreadMode.ASYNC)
public void setTv_show(eventBusEvent1 eventBusEvent1){
    tv_show.setText(eventBusEvent1.getStr());
}

5、发布事件

创建一个事件,调用post方法进行发布,所有的订阅该事件的方法都会被触发调用。

eventBusEvent2 eventBusEvent2 = new eventBusEvent2();
eventBusEvent2.setI(i);
EventBus.getDefault().post(eventBusEvent2);

6、事件优先级

当一个事件同时有几个方法订阅,并且在同一个线程模式下,可以通过配置优先级来指定它们调用的先后顺序。优先级priority默认为0,数值越大,执行的顺序越靠前。

@Subscribe(priority = 1)
public void setTv_show(eventBusEvent1 eventBusEvent1){
    tv_show.setText(eventBusEvent1.getStr());
}

7、粘性事件

就是把事件提前发送出来,当某个类注册EventBus并且有该事件的订阅方法,就能马上被调用,这相当于EventBus做了缓存,和事件的优先级一样,使用的频率较少。

eventBusEvent1.setStr("这里是service发布的数据: "+i);
EventBus.getDefault().postSticky(eventBusEvent1);
@Subscribe(sticky = true,threadMode = ThreadMode.MAIN)
public void setTv_show(eventBusEvent1 eventBusEvent1){
    tv_show.setText(eventBusEvent1.getStr());
}

EventBus的基本使用就是这么简单,他的效率比通过广播或者加接口等的形式更加高。但是缺点是需要注册和反注册,有时候忘记反注册容易引起内存泄漏,而且,需要创建一个新的类。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏思筠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值