D/MainActivity: onMessageEventMain(), current thread is main
D/MainActivity: onMessageEventMainOrdered(), current thread is main
EventBus粘性事件
EventBus粘性事件所处理的问题是:发布者先发送了事件,但是此时订阅者还未产生,一段时间后订阅者才订阅了该事件,也就是使得在发送事件之后订阅者再订阅该事件也能收到该事件。
比如需求是在第一个Activity中发送事件,然后启动第二个Activity接收事件进行处理 ,但此时在打开第二个Activity时是接收不到消息的,主要是因为第二个Activity在第一个Activity发送事件时还未完成EventBus的注册,此时就需要使用粘性事件处理。
接收粘性事件的订阅者方法注解必须添加sticky = true
属性:
@Subscribe(sticky = true)
public void onMessageEvent(MessageEvent event) {
}
发布粘性事件使用postSticky()
:
EventBus.getDefault().postSticky(new MessageEvent(“Hello EventBus!”));
发布一个粘性事件之后,EventBus将一直缓存该粘性事件。如果想要移除粘性事件,那么可以使用如下方法:
// 移除指定的粘性事件
removeStickyEvent(Object event);
// 移除指定类型的粘性事件
removeStickyEvent(Class eventType);
// 移除所有的粘性事件
removeAllStickyEvents();
例子:
点击MainActivity的按钮时,先发送一个粘性事件,再启动SecondActivity
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_go:
EventBus.getDefault().postSticky(new MessageEvent(“Hello”));
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
break;
default:
break;
}
}
在打开的SecondActivity中订阅该事件:
public class SecondActivity extends Activity {
private final static String TAG = SecondActivity.class.getSimpleName();
private Button mSendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
initView();
EventBus.getDefault().register(this);
}
private void initView() {
mSendBtn = (Button) findViewById(R.id.btn_send);
}
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageEvent(MessageEvent event) {
Log.i(TAG, "onMessageEvent: " + event.getMessage());
// 更新界面
mSendBtn.setText(event.getMessage());
// 移除粘性事件
EventBus.getDefault().removeStickyEvent(event);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
输出:
EventBus事件优先级
EventBus支持在定义订阅者方法时指定事件传递的优先级。默认情况下,订阅者方法的事件传递优先级为0。数值越大,优先级越高。在相同的线程模式下,更高优先级的订阅者方法将优先接收到事件。
注意:优先级只有在相同的线程模式下才有效。如果相同的线程模式下的订阅方法都没有指定优先级(默认优先级为 0),则接收事件的方法顺序会按照方法名的字母排序。
指定事件传递优先级需要在订阅方法注解上添加priority
属性:
@Subscribe(priority = 1)
pu