EventBus3的基本使用指南
使用EventBus可以省略繁杂的Handler,效果也是类似的,使用方法也很简单。这里从官网上面做一个小小的总结,可以看得更全面一些。
入门贴
定义事件
事件就是一个普通的Java类,POJO就好。
1 | public class MessageEvent { |
订阅事件
事件的订阅者会被调用以处理相应的事件。使用@Subscribe
定义。EventBus 3
对函数名没有要求。
1 | // 当MessageEvent事件被发送的时候,此方法会被调用(在主线程中) |
事件的订阅函数所在的地方,需要先声明订阅,并且最好在相应的时候取消事件的订阅。只有订阅了,才会收到事件消息。因此一般会在Activity
或Fragment
的生命周期中进行上述操作。
1 |
|
发送事件
你可以在任何代码中进行事件的发送。所有对匹配此事件的订阅者都将会收到此事件。
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
指定订阅者函数执行的线程
如果不指定线程,那么将默认与发送事件处于相同的线程。
ThreadMode | 说明 |
---|---|
POSTING | 默认模式,与发送事件时所处的线程相同。 |
MAIN | 主线程。注意在订阅函数内不用做太多耗时的操作,以免堵塞主线程。如果事件是在主线程中发送的,那么订阅者将会立即执行对于的函数。 |
MAIN_ORDERED | 主线程。如果已经有一个订阅者的函数在执行,那么将等待它执行完毕后,才执行当前订阅者的函数。与其名字相呼应吧! |
BACKGROUND | background线程。如果事件不是在主线程中发送的,那么订阅者将立刻在此发送线程中执行;如果是在主线中发送的,那么将会开启一个线程,并在此线程中依次发送所有的事件,当订阅者收到此事件时,将会在此线程中执行吧! |
ASYNC | 会开启一个独立的线程来执行订阅者函数。可以考虑将比较耗时的操作设为此模式,如网络访问。这些线程会被一个线程池管理,以提高重新利用的效率。 |
配置
示例是配置当没有订阅者时的一些操作。
1 | EventBus eventBus = EventBus.builder() |
上面获取到EventBus实例的方式与之前示例中获取到EventBus实例不太一样。其中的差距此处获取到的只是当前的实例,后者是默认的实例。如何才能配置默认的实例呢?
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
其中installDefaultEventBus()
只能调用一次。
参考
EventBus3的基本使用指南