EventBus初体验(二)

背景:

上一篇EventBus初探遇到一个问题就是在 startActivity(intent);之后立即发送EventBus.getDefault().post(new MessageEvent(“我是EventBus发送到消息”));这个消息,下个界面时无法接收到消息的,当时心里一万只cnm在翻腾,这nm用起来有多少场景不能用。后来才知道EventBus是有粘性事件的,对,你没有看错,是粘性事件,和Android的粘性广播一个道理。现在就来简单的研究一下这个东东怎么用,大神请绕过(http://greenrobot.org/eventbus/documentation/configuration/sticky-events/)。

何为粘性事件:

看官网如何解释:Some events carry information that is of interest after the event is posted. For example, an event signals that some initialization is complete. Or if you have some sensor or location data and you want to hold on the most recent values. Instead of implementing your own caching, you can use sticky events. So EventBus keeps the last sticky event of a certain type in memory. Then the sticky event can be delivered to subscribers or queried explicitly. Thus, you don’t need any special logic to consider already available data.

看谷歌如何翻译:事件发布后,有些事件携带有兴趣的信息。 例如,事件表明一些初始化完成。 或者如果您有一些传感器或位置数据,并且要保持最近的值。 而不是实现自己的缓存,您可以使用粘性事件。 所以EventBus将某个类型的最后一个粘性事件保留在内存中。 然后可以将粘性事件传递给用户或明确查询。 因此,您不需要任何特殊的逻辑来考虑已经可用的数据。

我的理解就是:EventBus是基于订阅者模式开发的,那么就存在订阅的问题,如果在订阅前就把消息发送出来了,那么之后的订阅者就无法收到消息了,比如本文的背景提到的,这个粘性事件就是把消息保存在内存中,使之后的订阅者也可以收到这个消息。当然内存保留太多的消息总会影响性能,这个时候就可以使用EvenBus提供的API删除这些粘性消息。

那么如何使用呢?很简单:

使用步骤:

1. 在你发送消息的时候使用
EventBus.getDefault().postSticky(new MessageEvent("我是EventBus发送过来的消息"));替代:
//EventBus.getDefault().post(new MessageEvent("我是EventBus发送到消息"));
2.接收处理消息的时候:
//增加sticky = true这个参数,值为true,非粘性事件为true
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void getMessage(MessageEvent messageEvent) {
    String getMessage = messageEvent.getMessage;
    tv_receive.setText(getMessage);
}

效果:

如何取消呢?官方提供了几个重载的方法:

 MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);//获取事件类型
 if (stickyEvent!=null){
        EventBus.getDefault().removeStickyEvent(stickyEvent);//取消指定类型的消息
 }
 //EventBus.getDefault().removeAllStickyEvents();//移除所有的类型

你可能感兴趣的:(第三方开源库使用)