EventBus使用详解
概述
EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅。以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
EventBus作为一个消息总线,有三个主要的元素:
Event:事件。可以是任意类型的对象
Subscriber:事件订阅者,接收特定的事件。在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都都是以onEvent开头的函数,3.0之后使用@Subscribe 注解指定。
Publisher:事件发布者,用于通知 Subscriber 有事件发生。可以在任意线程任意位置发送事件,直接调用eventBus.post(Object) 方法,可以自己实例化 EventBus 对象,但一般使用默认的单例就好了:EventBus.getDefault(), 根据post函数参数的类型,会自动调用订阅相应类型事件的函数。
关于ThreadMode
前面说了,Subscriber的函数只能是那4个,因为每个事件订阅函数都是和一个ThreadMode相关联的,ThreadMode指定了会调用的函数。有以下四个ThreadMode:
PostThread:事件的处理在和事件的发送在相同的进程,所以事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。
MainThread: 事件的处理会在UI线程中执行。事件处理时间不能太长,这个不用说的,长了会ANR的,对应的函数名是onEventMainThread。
BackgroundThread:事件的处理会在一个后台线程中执行,对应的函数名是onEventBackgroundThread,虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件,如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。
Async:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。
根据事件订阅都函数名称的不同,会使用不同的ThreadMode,比如果在后台线程加载了数据想在UI线程显示,订阅者只需把函数命名onEventMainThread。
基本用法
引入EventBus:
compile 'de.greenrobot:eventbus:3.0.0-beta1' 定义事件: public class MessageEvent { /* Additional fields if needed */ } 注册事件接收者: eventBus.register(this); 发送事件: eventBus.post(event) 接收消息并处理: public void onEvent(MessageEvent event) {} 注销事件接收: eventBus.unregister(this); 最后,proguard 需要做一些额外处理: #EventBus -keepclassmembers class ** { public void onEvent*(**); void onEvent*(**); }
黏性事件
EventBus还支持发送黏性事件。
何为黏性事件呢?
简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。
具体用法如下:
订阅黏性事件 EventBus.getDefault().register(StickyModeActivity.this); 黏性事件处理函数: @Subscribe(sticky = true) public void XXX(MessageEvent messageEvent) { ...... } 发送黏性事件: EventBus.getDefault().postSticky(new MessageEvent("test")); 处理消息事件以及取消订阅和上面方式相同。
事例
转载请注明来源:EventBus使用详解