天天看点

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

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

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

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

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

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

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

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

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

布局如下图

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

                                                                                                     firstActivity布局

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

                                                                                                    secondActivity布局

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

注册

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

注销

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

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

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

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

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

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

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

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

其实效果是一样的

整体运行效果如下

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

扩展——使用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);
                }
            }
        }
    };


}
           

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

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

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

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