EventBus3.0——Stick和Priority

来源:互联网 发布:豆瓣是什么软件 编辑:程序博客网 时间:2024/06/03 21:23

EventBus3.0——Stick和Priority

上一章讲述了EventBus3.0的基本使用,相对以前版本最大的区别在于引入了注解,其中threadMode变量的值对应了以前版本的四大观察者,今天主要讲述的是注解中的其他两大变量Stick和Priority的使用。注:EventBus采用的是观察者模式,观察者即订阅者(叫法上的差别请不要太较真,重要的还是思想)。

Stick

顾名思义,就是粘性,那么粘性的作用是什么呢,前一章我们有提到EventBus使用
第一步是注册观察者
第二步是创建观察者
第三步是发布事件
那么这里的Stick的作用就是可以先发布事件再注册观察者,代码如下:

@Override    public void onCreate(Bundle savedInstanceState) {        EventBus.getDefault().postSticky(new Student("10","pdm"));        EventBus.getDefault().register(this);        super.onCreate(savedInstanceState);    }

这样是不是就可以了呢?!当然不行,我们还需要在注解中给Stick赋值,不然无效:

@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)    public void pdmEventMainThread(Student student) {        Log.e(TAG,"onEventMainThread: " + student.getContent());    }

我们通过查看日志,来确定观察者能否收到消息(这里需要注意的是,因为是在onCreate中发布事件,不能做更新UI的操作):
这里写图片描述
搞定!当然,所有发布的事件都是可以移除的,粘性事件也不例外,我们看下有哪些方法用于移除事件:
这里写图片描述
至于怎么用就不用说了吧,接下来我们讲一下Priority。

Priority

顾名思义,优先级,如果同时存在多个观察者(threadMode相同),我们是不是可以通过优先级的设定,来决定哪一个观察者获得事件或者消息的顺序,这样就更加灵活了,我们来试一下(为了方便理解,我们这里以发送post事件为例):

@Override    public void onCreate(Bundle savedInstanceState) {        EventBus.getDefault().register(this);        EventBus.getDefault().post(new Student("10","pdm"));        super.onCreate(savedInstanceState);    }@Subscribe(threadMode = ThreadMode.POSTING,priority = 1,sticky = true)    public void pdmEvent(Student student) {        Log.e(TAG,"onEvent: " + student.getContent());    }    @Subscribe(threadMode = ThreadMode.POSTING,priority = 2,sticky = true)    public void pdmEventMainThread(Student student) {        Log.e(TAG,"onEventMainThread: " + student.getContent());    }    @Subscribe(threadMode = ThreadMode.POSTING,priority = 3,sticky = true)    public void pdmEventBackground(Student student) {        Log.e(TAG,"onEventBackground: " + student.getContent());    }    @Subscribe(threadMode = ThreadMode.POSTING,priority = 4,sticky = true)    public void pdmEventAsync(Student student) {        Log.e(TAG,"onEventAsync: " + student.getContent());    }

接下来依然是通过日志验证:
这里写图片描述
明显priority值越大,越先收到事件或消息。注意:优先级必须针对同一类型的观察者,即ThreadMode相同。
下一章我将讲述EventBus针对反射机制优化的索引机制,极大程度的优化了EventBus的使用效率。小伙伴再也不用担心使用EventBus会影响程序性能了。
最后给没有用过EventBus的朋友提供一个小demo:
http://download.csdn.net/detail/aiyh0202/9662495

1 0