上一篇文章我们简单使用了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地址欢迎下载