EventBus3.0集成使用详解(下)

本文详细介绍了EventBus 3.0中的粘性事件使用方法,包括不同线程模型的应用场景及如何通过粘性事件实现跨Activity的消息传递。此外,还提供了一个使用Service模拟特定条件下发送消息的例子。

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

上一篇文章我们简单使用了EventBusEventBus3.0使用详解(上),今天这章我来说说EventBus的粘性事件使用方法,在写例子之前我们再次了解一下@Subscriber(),在上个例子中我们并没有添加任何参数,直接空值放入,这是因为在EventBus默认是POSTING线程传入,如果你要问POSTING是什么,那么现在就来告诉你

在EventBus3.0中,有四种线程模型,分别是:

POSTING(默认线程):表示处理消息的线程和发布消息的线程是同一线程

MAIN(主线程):这个应该不用我多说,看字就知道是主(UI)线程,所以呢不能做耗时操作

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

ASYNC(异步线程) :表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作


介绍完@Subscriber的四种线程模型我们来写下粘性事件

先增加两个页面,分别为FirstActivity和SecondActivity

布局如下图


                                                                                                     firstActivity布局


                                                                                                    secondActivity布局

跟普通事件一样先注册EventBus,然后在Activity死亡的时候注销

注册


注销


在跳转的时候传递粘性消息,很多文章都说跳转Activity的时候EventBus是无法传递消息的,因为栈里没有该Activity,新打开的Activity因为生命周期的问题无法收到消息,其实用粘性事件是可以发送与接收的,我们先看发送事件


注意箭头,这个与普通事件的是不一样的,普通事件直接一个Post,而这个用的是PostSticky,这是发送粘性事件

然后我们看看接收粘性事件


这里我在@Subscribe这里增加了一个参数,看大意大家应该明白这个是接收粘性事件,默认的还是POSTING线程,你也可以修改为其他线程,如


其实效果是一样的

整体运行效果如下



扩展——使用EventBus代替广播传递消息

先写一个Service在后台运行,并创建一个线程模拟在特定条件下模拟发送广播,具体代码如下:

public class MyService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        try {
            runnable.run();
        } catch (Exception e) {

        }

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            /**
             * 线程启动后,模拟特定条件发送广播
             */
            MessageEvent messageEvent = new MessageEvent();
            for (int i = 0; i < 100; i++) {
                if (i % 13 == 0) {
                    messageEvent.setMessage("i=" + i + ",");
                    //发送消息
                    EventBus.getDefault().post(messageEvent);
                } else if (i == 99) {
                    messageEvent.setMessage("我是最后一条数据");
                    //发送消息
                    EventBus.getDefault().post(messageEvent);
                }
            }
        }
    };


}

接收消息与上面例子一样,运行程序



GitHub地址:EventBus3.0使用详解Demo欢迎Star

CSDN地址:EventBus3.0Demo地址欢迎下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值