Sticky Events(粘性事件)
-
官网直译
某些事件在事件发布后携带一些必要的信息,例如,某些初始化的操作完成,需要先获取到事件数据信息进行使用。或者,如果您有一些传感器或位置数据,并且希望保存最近的值。可以使用粘性事件进行传递,而不需要自己缓存下来。EventBus可以将最近一个特定类型的粘滞事件先保存在内存中。然后,可以将粘性事件传递给订阅者或显式查询。这样,我们不需要写一些逻辑来处理,就可以使用这些数据
-
粘性事件
粘性事件简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。其实就是先发送消息,然后再进行注册,注册后再去接收消息,类似使用Intent往新开启的Activity中传递消息.EventBus支持发送黏性事件
-
粘性事件的使用
粘性事件的使用分两种情况,分别是订阅方法接收处理粘性事件和手动处理粘性事件
- 订阅方法接收处理粘性事件
在注册订阅之前发送粘性事件
//在注册之前发送消息
String str = tvA.getText().toString().trim();
EventBus
.getDefault()
.postSticky(str);
startActivity(EventBusStickyBActivity.class);
在将要接收粘性事件的组件中注册注销粘性事件
@Override
public void initUI() {
setContentView(R.layout.activity_event_bus_sticky_b);
ButterKnife.bind(this);
EventBus
.getDefault()
.register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
订阅者方法中接收事件,然后进行后续逻辑处理
//接收上个页面传递过来的事件
//注册之后,接收消息
//需要注解中添加sticky = true
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onStickyMessage(String event) {
tvB.setText(event);
LogUtils.i(event.concat("----->onStickyMessage!"));
}
- 手动处理粘性事件
在注册订阅之前发送粘性事件
//在注册之前发送消息
String str2 = tvC.getText().toString().trim();
EventBus
.getDefault()
.postSticky(str2);
startActivity(EventBusStickyCActivity.class);
新页面注册粘性事件后,手动获取粘性事件
@Override
public void initUI() {
setContentView(R.layout.activity_event_bus_sticky_b);
ButterKnife.bind(this);
EventBus
.getDefault()
.register(this);
//手动管理stickyevent,但是必须定义接收事件的方法.
String stickyEvent = EventBus
.getDefault()
.getStickyEvent(String.class);
if (TextUtils.isEmpty(stickyEvent)) {
tvB.setText("sorry,have not reciver the sticky event!");
} else {
//接收后,有必要删除粘性事件,这样它们就不会再被传递了
EventBus
.getDefault()
.removeAllStickyEvents();
//使用这种方式删除也可以
//EventBus.getDefault().removeStickyEvent(stickyEvent);
tvB.setText(stickyEvent);
}
}
注销粘性事件
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault()
.unregister(this);
}
订阅者方法中接收事件,然后不进行后续逻辑处理
//接收上个页面传递过来的事件
//注册之后,接收消息,采用手接受事件,此方法不做任何逻辑处理,
//但是必须定义否则报错.
//需要注解中添加sticky = true
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onStickyMessage(String event) {}