转发请注明地址:http://blog.csdn.net/qq_36145843/article/details/66476845(谢谢~!)
上一篇文章我们简单的介绍了一下EventBus的粘性事件。这篇文章我们来讲讲EventBus的优先级和事件取消。
优先级(Priorities)
在相同的传递线程(ThreadMode)中,较高优先级的订阅户将在其他优先级较低的订阅户之前接收事件。默认优先级为0。
定义优先级:
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
...
}
接下来我们来做一个小demo来测试效果:
public class MainActivity extends AppCompatActivity {
private int i = 0;
private TextView mTextView;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTextView.setText("");
EventBus.getDefault().post(new MessageEvent("测试"));
}
});
}
@Subscribe(priority = 2,threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
mTextView.append(event.message+"========>priority = 2 " + i++ +"\n");
}
@Subscribe(priority = 1,threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {
mTextView.append(event.message+"========>priority = 1 " + i++ +"\n");
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent2(MessageEvent event) {
mTextView.append(event.message+"========>priority = 0 " + i++ +"\n");
}
@Override
protected void onStart() {
super.onStart();
//注册EventBus
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
//注销EventBus
EventBus.getDefault().unregister(this);
}
}
上述代码设置了三个订阅优先级,可以看到运行效果如下:
优先级还是比较好理解的。
事件取消
通过从订阅者的事件处理方法调用cancelEventDelivery (Object event ) 来取消事件传递过程 。任何其他活动传送将被取消,后续订阅者将不会收到活动。
@Subscribe
public void onEvent(MessageEvent event){
// Process the event
...
// Prevent delivery to other subscribers
EventBus.getDefault().cancelEventDelivery(event) ;
}
现在我们将上述代码让第三个不接收事件:
public class MainActivity extends AppCompatActivity {
private int i = 0;
private TextView mTextView;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTextView.setText("");
EventBus.getDefault().post(new MessageEvent("测试"));
}
});
}
@Subscribe(priority = 2)
public void onMessageEvent(MessageEvent event) {
mTextView.append(event.message+"========>priority = 2 " + i++ +"\n");
}
@Subscribe(priority = 1)
public void onEvent(MessageEvent event) {
mTextView.append(event.message+"========>priority = 1 " + i++ +"\n");
EventBus.getDefault().cancelEventDelivery(event);
}
@Subscribe()
public void onEvent2(MessageEvent event) {
mTextView.append(event.message+"========>priority = 0 " + i++ +"\n");
}
@Override
protected void onStart() {
super.onStart();
//注册EventBus
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
//注销EventBus
EventBus.getDefault().unregister(this);
}
}
运行效果如下图:
可以观察到我上述代码将threadMode去掉了,如果在 threadMode = ThreadMode.MAIN 中使用cancelEventDelivery(event) 的话将不能取消事件传递,因为cancelEventDelivery(event)方法只能在ThreadMode.POSTING中调用才有效。
好了,这篇文章到此结束。
源码地址 这里包括粘性事件的源码,和优先级的源码。