EventBus使用详解

    |     2016年8月30日   |   Android技术   |     0 条评论   |    1718

EventBus 是针对 Android 优化的发布/订阅事件总线,用来替代 Intent、Handler、Broadcast,在 Fragment、Activity、Service 和线程之间传消息,把发送者和接收者解耦。


一、概述

网络返回时用 Handler 或 Broadcast 通知 UI,两个 Fragment 要靠 Listener 通信——这些都可以交给 EventBus。开销小,代码更干净。eventbusall


二、三个主要元素

  • 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:

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 需要额外保留 onEvent*:

#EventBus
-keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
}

五、黏性事件

黏性事件:发送之后再订阅也能收到,跟黏性广播类似。

EventBus.getDefault().register(StickyModeActivity.this);

@Subscribe(sticky = true)
public void XXX(MessageEvent messageEvent) {
    ......
}

EventBus.getDefault().postSticky(new MessageEvent("test"));

处理消息以及取消订阅,和上面方式相同。


六、事例

event4

下载点这里

EventBus源码解析 TmWork

一句话总结:Event 任意对象、Subscriber 按类型收、Publisher 随处 post;用 ThreadMode 选线程,黏性事件则 postSticky,用完记得 unregister。

转载请注明来源:EventBus使用详解
本文链接地址:https://ai.zhousir.top/?p=1688
回复 取消