EventBus使用详解
EventBus 是针对 Android 优化的发布/订阅事件总线,用来替代 Intent、Handler、Broadcast,在 Fragment、Activity、Service 和线程之间传消息,把发送者和接收者解耦。
一、概述
网络返回时用 Handler 或 Broadcast 通知 UI,两个 Fragment 要靠 Listener 通信——这些都可以交给 EventBus。开销小,代码更干净。
二、三个主要元素
-
Event:事件,可以是任意类型的对象。 -
Subscriber:事件订阅者。约定以 onEvent 开头的函数;3.0 之后用 @Subscribe注解指定。 -
Publisher:事件发布者。任意线程任意位置调用 eventBus.post(Object)。一般用默认单例EventBus.getDefault(),按 post 参数类型回调对应订阅函数。
三、关于 ThreadMode
每个订阅函数都和一个 ThreadMode 关联,决定在哪条线程执行:
-
PostThread:处理和发送在同一线程,处理时间不应太长(可能是 UI 线程)。对应 onEvent。 -
MainThread:在 UI 线程执行,太长会 ANR。对应 onEventMainThread。 -
BackgroundThread:后台线程。发送方若已是后台线程则直接执行;若是 UI 线程则进队列,由一条线程依次处理,某个事件太长会堵住后面。对应 onEventBackgroundThread。 -
Async:每个事件单独线程(有线程池),适合耗时操作,但要限制线程数。
后台加载数据、要在 UI 显示时,订阅函数命名 onEventMainThread 即可。
| ThreadMode | 执行线程 | 对应函数 |
|---|---|---|
| PostThread | 与发送线程相同 | onEvent |
| MainThread | UI 线程 | onEventMainThread |
| BackgroundThread | 后台(可能排队) | onEventBackgroundThread |
| Async | 独立线程 / 线程池 | 耗时操作用 |
四、基本用法
引入 EventBus:
定义事件、注册、发送、接收、注销:
ProGuard 需要额外保留 onEvent*:
五、黏性事件
黏性事件:发送之后再订阅也能收到,跟黏性广播类似。
处理消息以及取消订阅,和上面方式相同。
六、事例
一句话总结:Event 任意对象、Subscriber 按类型收、Publisher 随处 post;用 ThreadMode 选线程,黏性事件则 postSticky,用完记得 unregister。
转载请注明来源:EventBus使用详解







