Eventbus是一个发布/订阅的事件总线。
四元素分别是发布者,订阅者,事件及总线。
1. 订阅者通过EventBus.getDefault().register(this);订阅事件
EventBus.getDefault().unregister(this);//取消订阅
2. 发布者通过EventBus.getDefault().post(object);发布事件
AndroidEventBus还包含了一个tag参数。EventBus.getDefault().post(object,tag);
3. 最重要的是区别Evenbus 和 AndroidEventBus
网上大部分都是基于greenrobot的Eventbus的,但实际上AndroidEventBus的@Subscriber(tag = blabla , mode = blabla)好用无比,它可以通过不同的tag通知不同的订阅者处理不一样的工作,相比之下,greenrobot的Eventbus只根据函数的参数类型来区别和接受消息,非常局限而且不灵活。mode的类型包括:
1.ThreadMode.POST 执行在POST函数的线程中
2. ThreadMode.ASYNC 异步执行
3. ThreadMode.MAIN, 执行在UI线程中
这个和greenrobot的Eventbus的4个线程类型大同小异,即
1. MainThread:事件响应函数会在Android应用的主线程(大部分情况下都是UI线程)中执行。即:public void onEventMainThread()
2. PostThread:事件响应函数和事件发布在同一线程中执行。这个是默认值,这样可以避免线程切换。
3. BackgroundThread:事件响应函数会在一个后台线程中执行。如果事件发布函数不是在主线程中,则会立即在事件发布线程中执行响应函数。如果事件发布函数在主线程中,EventBus则会在唯一的一个后台线程中按照顺序来执行所有的后台事件响应函数。上面的3种事件响应函数,应该能够很快的执行完,不然的话会阻塞各自的事件发布。
4. async:事件响应函数在另外一个异步线程中执行。该线程和发布线程、主线程相互独立。如果事件响应函数需要较长的时间来执行,则应该使用该模式,例如 网络访问等。需要注意的是,由于系统并行的限制,应该避免在同一时间触发大量的异步线程。 EventBus使用一个线程池来提高线程的效率。
但感觉不好用的地方是,不如自定义设计Listener接口去监听消息的针对性强,如果几个订阅者都订阅了一个事件,但需要针对不同的发布者做出的同一事件以作区别就办不到了。。譬如目前这个备份项目,在用户手动备份完成时需要弹出提示框,自动备份的时候不需要弹出提示框,自动备份和手动备份都调用了同一函数进行备份,备份完成时post消息,这时候手动备份界面可能会接到了自动备份的post消息从而弹出了提示框。解决办法只能通过另设标志符。
Eventbus地址:https://github.com/bboyfeiyu/AndroidEventBus
https://github.com/greenrobot/EventBus