学习EventBus的使用
介绍EventBus
为什么要使用EventBus呢?
当我们的Fragment过多的时候,组件之间传递信息会变得异常繁琐,单例不是很好的解决方案,通常我们会使用观察者模式来解决这个问题。EventBus就是一个很不错的观察者模式框架。
EventBus实现了什么?
主要用于事件的发布和订阅。EventBus定义:是一个发布 / 订阅的事件总线。
包含4个成分
- Publisher:发布者
- Subscriber:订阅者
- Event:事件,Event可以是任何类型的对象
- 总线。
那么这四者的关系是什么呢?很明显:订阅者订阅事件到总线,发送者发布事件。
订阅者Subscriber
在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都都是以onEvent开头的函数,具体来说
- onEvent 它和ThreadModel中的PostThread对应,这个也是默认的类型,当使用这种类型时,回调函数和发起事件的函数会在同一个线程中执行,所以事件处理时间不应太长
- onEventMainThread 它和ThreadModel中的MainThread对应,当使用这种类型时,回调函数会在主线程中执行,这个在Android中非常有用,因为在Android中禁止在子线程中更新UI。处理时间也不能太长。
- onEventBackgroundThread 当使用这种类型时,如果事件发起函数在主线程中执行,那么回调函数另启动一个子线程,如果事件发起函数在子线程执行,那么回调函数就在这个子线程执行
- onEventBusAsync 当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调,但最好限制线程的数目。
发布者Publisher
可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)
方法,可以自己实例化EventBus对象,但一般使用默认的单例就好了:EventBus.getDefault().post(Object)
,根据post函数参数的类型,会自动调用订阅相应类型事件的函数。
使用EventBus
引入依赖
编辑app的build.gradle1
compile 'org.greenrobot:eventbus:3.0.0'
简单使用步骤
定义事件类型
1
2public class MyEvents {
}在订阅者类里,新建事件处理方法
1
2
3
4@Subscribe
public void onEventMainThread(MyEvent events){
}
千万别忘记写@Subscribe注解了,详情见EventBus 注册错误no public methods with the @Subscribe annotation
注册订阅者,在构造函数或onCreate(Bundle savedInstanceState)
1
EventBus.getDefault().register(this);
取消订阅者,在onDestory()方法
1
EventBus.getDefault().unregister(this);
发送事件,可以在任意方法,线程
1 | EventBus.getDefault().post(new MyEvent()); |
参考文献
AngelDevil的快速Android开发系列通信篇之EventBus
Android EventBus实战 没听过你就out了
Android中开源库EventBus使用详解