EventBus3.0带你乐翻天
总阅读次
你还在为刷新ui伤透脑筋吗?你还在琢磨如何使用接口回调或者handle来实现吗?如果你想到了使用观察者模式,那么一个很屌的Android开源框架EventBus:主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。他的最牛逼优点是开销小,代码简洁,解耦代码。
如果你没有使用过eventBus那么很遗憾你错过了很多,不过没有关系3.0的正式发布,使用没有什么大不一样只是性能更好。
个人建议直接使用3.0.0的版本,也不要去使用2.4和3.0beta1的版本了。
看图说话:
EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。
EventBus作为一个消息总线,有三个主要的元素:
- Event:事件。可以是任意类型的对象
- Subscriber:事件订阅者,接收特定的事件。在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都都是以onEvent开头的函数,具体来说,函数的名字是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync这四个,这个和
ThreadMode(下面讲)有关。
- Publisher:事件发布者,用于通知 Subscriber 有事件发生。可以在任意线程任意位置发送事件,直接调用eventBus.post(Object) 方法,可以自己实例化 EventBus
对象,但一般使用默认的单例就好了:EventBus.getDefault(), 根据post函数参数的类型,会自动调用订阅相应类型事件的函数。
EventBus使用详解
EventBus使用步骤
(1)引入EventBus:
- 引入eventbus:2.4.0(回顾老版本)
compile ‘de.greenrobot:eventbus:2.4.0’
- 引入eventbus:3.0.0-beta1
compile ‘de.greenrobot:eventbus:3.0.0-beta1’
- 引入eventbus:3.0.0
compile ‘org.greenrobot:eventbus:3.0.0’
(2)定义一个消息类,该类可以不继承任何基类也不需要实现任何接口。如:
|
|
(3)在需要订阅事件的地方注册事件
EventBus.getDefault().register(this);
(4)发送事件:即发送消息
EventBus.getDefault().post(messageEvent);
(5)处理消息
在3.0之前,EventBus还没有使用注解方式。消息处理的方法也只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,分别代表四种线程模型。而在3.0之后,消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(beta1默认为PostThread,正式版默认为POSTING),四种线程模型,下面会讲到。
注意,事件处理函数的访问权限必须为public,否则会报异常。
EventBus3.0与EventBus2.4的区别
- EventBus 2.4在使用方式
|
|
|
|
|
|
|
|
- 在EventBus 3.0.0的使用是这样的
(1) beta1版的写法
|
|
|
|
|
|
|
|
(2) 正式版的写法
|
|
|
|
|
|
|
|
(6)取消消息订阅
EventBus.getDefault().unregister(this);
(7)代码混淆
|
|
看下简单实现的效果(带妹子的手机桌面):
看下具体的代码使用:
|
|
|
|
可以看出哪里需要发送消息,那么就必须使用:
EventBus.getDefault().post(your event)
然后你只需要订阅就好了:
|
|
事件的优先级处理
接收事件方法可以通过@Subscribe(priority = 1)
priority的值来决定接收事件的顺序,数值越高优先级越大,默认优先级为0.
(注意这里优先级设置只有在同一个线程模型才有效)
|
|
同一模式下优先级高的先执行,看图:
|
|
不同ThreadMode运行下结果看图:
事件优先级不影响不同线程模型订阅事件顺序.
EventBus粘性事件
除了上面讲的普通事件外,EventBus还支持发送黏性事件。简单讲,就是在发送事件之后再订阅该事件也能收到该事件.粘性事件能够收到订阅之前发送的消息。但是它只能收到最新的一次消息,比如说在未订阅之前已经发送了多条黏性消息了,然后再订阅只能收到最近的一条消息。
注册和注销方法一样,发送事件和订阅事件有些区别
发送事件
|
|
订阅粘性事件 默认sticky为false
|
|
看荔枝:
|
|
activity_sticky.xml
|
|
看我的执行步骤:
- 首先在未订阅的情况下点击发送按钮发送一个黏性事件,然后点击订阅,打印如下: —>
- 我们连续点击发送事件按钮发送黏性事件,然后再点击注册按钮订阅,打印结果如下:—>
是不是接到了最后一个事件。
取消订阅事件
你可以取消事件订阅通过调用cancelEventDelivery(Object event)方法,任何进一步的事件交付将被取消,后续用户不会接收到事件,但是该方法只有在ThreadMode.PostThread事件处理方法中调用才有效.
就讲到这里了》》》
注意:
@Subscribe 下的方法必须为public
postSticky()发送的粘性消息订阅时必须@Subscribe(sticky = true)否则接收不到
发送的event事件是object类
@Subscribe(priority = 1) 使用时优先级默认为0,然后只有统一模式下设置优先级才有效果,自己看着合理使用
demo传送门:EventBusApp
觉得还不错的帮忙顶一下,大家相互学习一下,哈哈哈。
未经许可不得转载,转载请注明zilianliuxue的blog,本人保留所有版权。