EventBus粘性事件(三)

作者: eirunye | 来源:发表于2018-10-19 11:22 被阅读7次

简介

例如:事件表示某些初始化已完成。或者,如果您有一些传感器或位置数据,并且您希望保留最新值。您可以使用粘性事件,而不是实现自己的缓存。因此,EventBus会将特定类型的最后一个粘性事件保留在内存中。然后,粘性事件可以传递给订阅者或明确查询。因此,您不需要任何特殊逻辑来考虑已有的数据,或者是当你在新启动一个新的Activity的时候,你想传达信息过去,可以根据粘性事件,就可以进行获取到数据,当然了,Intent事件肯定也可以传递信息数据的,但是在这里我们所要说的是EventBus的粘性事件。

EventBus-Android的发布 - 订阅

进入测试

代码分析

比如我打开一个Activity页面我就发送了一个粘性事件如下。

 EventBus.getDefault().postSticky(new MessageEvent("发送粘性事件!"));

然后我点击跳转到新的StickyTestActivity页面然后我进行接收该事件的数据信息,完全没有问题的接收到了信息(在注册期间,所有粘性订阅者方法将立即获得先前发布的粘性事件)。

 @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onMessageStickyEvent(MessageEvent event) {
        Log.d(TAG, "onMessageStickyEvent。。。");
        textView.setText(event.message);
        //表示如果粘性事件不为空,则手动删除手动获取和删除粘性事件,
       //testSticky方法无法获取粘性事件的信息了。
        //MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
        //if (stickyEvent != null) {
            //EventBus.getDefault().removeStickyEvent(stickyEvent);
            // testSticky();
        //}
    }
private void testSticky() {
        MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
        //检查事件是否实际发布
        if (stickyEvent != null) {
            Log.d(TAG, "stickyEvent。。。");
            textView.setText("接收信息:"+stickyEvent.message);
        }
    }
 @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

手动获取和删除粘性事件

由上面的代码可以知道在onMessageStickyEvent()方法中就是手动手动获取和删除粘性事件。这样testSticky()方法就无法接收到消息数据了。

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
        if (stickyEvent != null) {
            EventBus.getDefault().removeStickyEvent(stickyEvent);     
}

方法 removeStickyEvent被重载:当你传入类时,它将返回先前持有的粘性事件。使用此变体,我们可以改进前面的示例:

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// 检查事件是否实际发布
if(stickyEvent != null) {
    //  do something
}

测试

1.进入页面就发送粘性事件发送数据字符串:发送粘性事件!
2.点击按钮跳转页面查看是否获取粘性事件发送的消息数据。

粘性发送测试.png 接收消息.png

下载

总结

我们使用粘性事件的时候需要注意的是,当我们不想要改数据的时候一定要清空掉,或者在退出activity时直接清空掉,这样不会影响我们的接收数据,根据自己的需求来设置

推荐

相关文章

  • Android EventBus粘性事件实现机制探究

    Android EventBus粘性事件实现机制探究 众所周知,eventbus是支持粘性事件的,即可以先发送粘性...

  • EventBus全解析系列(五)

    EventBus 源代码分析-你不知道的EventBus小环节 1.STICKY 粘性事件 在EventBus中有...

  • EventBus粘性事件(三)

    简介 例如,事件表示某些初始化已完成。或者,如果您有一些传感器或位置数据,并且您希望保留最新值。您可以使用粘性事件...

  • eventBus粘性事件

    因为请求接口然后再发送事件再进行控件的更新。有时候该控件所在的页面可能没有初始化好。这时候eventbus所发送的...

  • EventBus 简单使用(二)

    EventBus 简单使用(一) 日更 14 天。 本文主要介绍以下两个知识点,重点是 粘性事件 粘性事件 混淆 ...

  • 手把手debug源码之EventBus

    本文基于EventBus3.1.1进行源码分析,以发送一个正常事件和粘性事件为例,探索EventBus工作的整个过...

  • EventBus框架初解

    EventBus其实解决了这样几个问题:保存订阅者、发布事件、切换线程、粘性事件 保存订阅者 在register(...

  • EventBus3.0使用(二)

    上一篇EventBus3.0使用(一) Sticky Events 粘性事件 Sticky Events可以允许事...

  • EventBus3.0源码分析

    本文分为以下几个部分:创建、注册、发送事件、粘性事件来讲解它的实现原理,本文使用Eventbus版本为3.1.1。...

  • EventBus 3.X源码分析

    前言 本文会通过阅读 EventBus 源码的方式分析订阅者注册、反注册、事件发送、粘性事件发送的过程。 依赖 基...

网友评论

    本文标题:EventBus粘性事件(三)

    本文链接:https://www.haomeiwen.com/subject/nxahzftx.html