EventBus配置、粘性事件、优先级和取消事件分发

2019-08-17 13:04:00 浏览数 (2)

EventBus配置

前面的博客中获取EventBus,都是使用EventBus.getDefault(),而如果需要对EventBus进行配置,那么需要使用EventBus.Builder进行设置。

代码语言:javascript复制
EventBus eventBus = EventBus.builder()
    .logNoSubscriberMessages(false)
    .sendNoSubscriberEvent(false)
    .build();

粘性事件

一般情况下,发布者将事件发出,如果没有对该事件感兴趣的订阅者,那么这条消息就消失了;而粘性事件则允许,在订阅者后来注册到事件中心,还能收到该事件。 在EventBus简介以及初步使用中,Activity A是订阅者,Activity B是发布者,这儿我们换一下,Activity A发布一个粘性事件,代码如下:

代码语言:javascript复制
public void downloadPage(View view) {
        EventBus.getDefault().postSticky(new DownloadEvent());
        startActivity(new Intent(this,SecondActivity.class));
    }

Activity B的代码如下:

代码语言:javascript复制
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        EventBus.getDefault().register(this);
    }

    @Subscribe(sticky = true)
    public void download(DownloadEvent downloadEvent) {
        Toast.makeText(this,"Receive Sticik Event",Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

当Activity A跳转到Activity B时将会有Toast提示;当把Activity B中download方法的注解stick修改为false后,将不再有Toast提示,从而可以看到粘性事件是如何作用的。

手动获取和取消粘性事件

如果需要手动取消粘性事件,那么可以执行以下代码:

代码语言:javascript复制
DownloadEvent stickyEvent = EventBus.getDefault().getStickyEvent(DownloadEvent.class);
        if(stickyEvent!=null){
            EventBus.getDefault().removeStickyEvent(stickyEvent);
        }

        DownloadEvent previousEvent = EventBus.getDefault().removeStickyEvent(DownloadEvent.class);
        if(previousEvent!=null){
            EventBus.getDefault().removeStickyEvent(previousEvent);
        }

优先级

Subscribe注解可以使用priority进行修饰,同一分派线程中,优先级越高,订阅方法越先处理。

取消事件分发

代码语言:javascript复制
@Subscribe
public void onEvent(MessageEvent event){
    EventBus.getDefault().cancelEventDelivery(event) ;
}

一旦取消了事件的分发,事件将不再继续向下进行分发。 一点设想,可以通过优先级 取消事件分发构建拦截链

0 人点赞