Priorities and Event Cancellation:
事件優(yōu)先級和事件取消
大多數(shù)情況下回俐,eventbus不需要改變線程優(yōu)先級逛腿,或者取消事件,但是不排除少數(shù)情況,需要改變線程優(yōu)先級仅颇。
Subscriber Priorities
官方demo
//priority默認為0单默,不同ThreadMode下的分發(fā)流程不受優(yōu)先級的影響
//優(yōu)先級高的可以優(yōu)先獲得消息
priority的值越大,優(yōu)先級越高,越先接收到消息
注意:優(yōu)先級不影響不同ThreadModes訂閱者之間的交付順序!
@Subscribe(priority = 1)
public void onEvent(MessageEvent event) {
…
}
Cancelling event delivery
取消事件傳遞
如果忘瓦,不希望后續(xù)的subcriber(訂閱者)收到消息搁廓,可以在收到消息后,調用cancelEventDelivery(Object event) 取消消息的后續(xù)傳遞政冻。
官方demo
//默認在同一線程調用
@Subscribe
public void onEvent(MessageEvent event){
// Process the event
…
EventBus.getDefault().cancelEventDelivery(event) ;
}
Note:一般情況下枚抵,event的取消發(fā)生在高優(yōu)先級的subscriber(訂閱者),取消僅限于在投遞線程中運行的事件處理方法。
代碼使用實戰(zhàn)
注冊注銷
@Override
public void initUI() {
setContentView(R.layout.activity_priorities);
ButterKnife.bind(this);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
在同一個線程模式下定義不同的優(yōu)先級來接收消息
@Subscribe
public void onEvent0(final MessageEvent event) {
final String text = "onEvent0".concat(logEvent(event));
LogUtils.i(text);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvPriorities0.setText(text);
}
});
}
@Subscribe(priority = 1)
public void onEvent1(MessageEvent event) {
final String text = "onEvent1".concat(logEvent(event));
LogUtils.i(text);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvPriorities1.setText(text);
}
});
}
@Subscribe(priority = 2)
public void onEvent2(MessageEvent event) {
final String text = "onEvent2".concat(logEvent(event));
LogUtils.i(text);
//中斷后續(xù)的事件傳遞
EventBus.getDefault().cancelEventDelivery(event) ;
runOnUiThread(new Runnable() {
@Override
public void run() {
tvPriorities2.setText(text);
}
});
}
@Subscribe(priority = 10)
public void onEvent10(MessageEvent event) {
final String text = "onEvent10".concat(logEvent(event));
LogUtils.i(text);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvPriorities10.setText(text);
}
});
}
其中優(yōu)先級為2的訂閱者方法中,接收到事件后中斷后續(xù)的傳遞
接下來我們點擊按鈕發(fā)布消息
@OnClick(R.id.btn_priorities)
public void onViewClicked() {
Runnable runnable = new Runnable() {
public void run() {
EventBus
.getDefault()
.post(new MessageEvent("hello priorities message is coming!"));
}
};
new Thread(runnable).start();
}
我們獲取到接收消息的時間,并打印日志展示控件
private String logEvent(MessageEvent event) {
String tag = "-->";
String s = tag.concat(event.message)
.concat(tag)
.concat("currentTime:")
.concat(String.valueOf(System.currentTimeMillis()));
return s;
}
發(fā)送消息之間的頁面
點擊按鈕后日志打印結果
onEvent10-->hello priorities message is coming!
-->currentTime:1524204430398
onEvent2-->hello priorities message is coming!
-->currentTime:1524204430399
點擊按鈕后控件的展示
結果分析
從日志結果和控件的展示來說,優(yōu)先級為10的訂閱者方法優(yōu)先接收到消息,其次優(yōu)先級為2的訂閱者方法接收到消息,而此訂閱切斷事件傳遞后,優(yōu)先級為1和0的訂閱者方法沒有在接收到消息.