EventBus3官方文档翻译(二)

来源:互联网 发布:mac 快捷键设置没有用 编辑:程序博客网 时间:2024/06/03 22:04

EventBus3官方文档翻译(二)

Configuration(配置)

EventBusBuilder类可以配置多样的EventBus,例如,配置一个静静的eventbus:post事件,没有订阅者;

EventBus eventBus = EventBus.builder()    .logNoSubscriberMessages(false)    .sendNoSubscriberEvent(false)    .build();

另一个例子,当一个订阅者抛出一个异常,eventbus将会fail;

EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();

提示:默认地,EventBus捕获从订阅者抛出的异常,并且发送SubscriberExceptionEvent,但不是必须处理的;

  • Configure the default EventBus instance(配置默认的EventBus实例)

使用EventBus.getDefault()是一个简单获取EventBus实例的方式,也允许使用方法installDefaultEventBus()配置默认的实例;

例如,配置默认的EventBus实例,让它重新抛出发生在订阅者方法中的异常,但只是在DEBUG模式中使用,因为它会让app crash;

EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();

提示:在默认的EventBus使用之前只可以配置一次,以后再配置会抛出异常,这个保证app具有一致的行为,你的application类是不错的地方用来配置默认的EventBus实例;

Sticky Events(粘性事件)

一些携带信息的事件,在它们post之后,等段时间会被使用到,例如:一个标志初始化完成的事件,或者你想要保存传感器或定位最新的数据;取代你自己实现事件捕获,你可以使用sticky events,EventBus把上一次sticky events类型保存在内存中,那样sticky events可以传送给订阅者或明确地访问,你不需要逻辑考虑已经可用的数据;

Sticky Example

一个sticky events是在一段时间前post出:

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));

现在一个新的activity start,在注册的时候,所有粘性订阅者会立即收到之前post的粘性事件;

@Overridepublic void onStart() {    super.onStart();    EventBus.getDefault().register(this);}// UI updates must run on MainThread@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)public void onEvent(MessageEvent event) {    textField.setText(event.message);}@Overridepublic void onStop() {    EventBus.getDefault().unregister(this);    super.onStop();}

Getting and Removing sticky Events manually(手动的获得和删除粘性事件)

正如你所看到,当订阅者注册,上一个粘性事件会自动地传送过去,但是,有时候,手动检查粘性事件也是很方便的,有必要的情况可以手动消耗粘性事件不让它们被传送

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // "Consume(消耗)" the sticky(粘的) event    EventBus.getDefault().removeStickyEvent(stickyEvent);    // Now do something with it}

方法removeStickyEvent可以多用的,当你传递进去class,它会返回之前保留的粘性事件,使用这个方法,我们可以改进前面的例子:

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // Now do something with it}

Priorities and Event Cancellation(优先级与事件取消)

大多数例子中EventBus不会用到优先级和事件取消,只有少数情况下才会使用到,例如:一个事件在app在前台的时候可以改变UI逻辑,但是如果当前app不可见,则不同的响应;

  • Subscriber Priorities(订阅者优先级)

在注册时,通过给订阅者提供一个priority(优先级),你可以改变事件传递的顺序

@Subscribe(priority = 1);public void onEvent(MessageEvent event) {    ...}

在相同的事件传递线程中(thread mode),高优先级的订阅者比低优先级的订阅者先收到事件,默认的优先级为0;
提示:在不同thread mode中,优先级不会影响订阅者之间的传递顺序;

Cancelling event delivery(取消事件分发)

你可以在订阅者的事件处理方法中,通过回调cancelEventDelivery(Object event)来取消事件继续分发,任何更深层的分发将会被取消,因此后面订阅者不会接收到事件;

// Called in the same thread (default)@Subscribepublic void onEvent(MessageEvent event){    // Process the event    ...    // Prevent delivery to other subscribers    EventBus.getDefault().cancelEventDelivery(event) ;}

事件通常被高优先级的订阅者取消.取消事件传递只能在posting线程中,不可以在其他threadmode中取消( Cancelling is restricted to event handling methods running in posting thread ( ThreadMode.PostThread)).

Eventbus 3官方文档翻译(一)

EventBus3官方文档翻译(三)

如有不妥的地方,欢迎留言指出。。。

0 0
原创粉丝点击