Event Bus

EventBus 是一个Android和Java的开源库,使用发布者/订阅者模式进行松耦合。 EventBus支持集中通信,只需几行代码就可以解耦类——简化代码,消除依赖关系,加快应用程序开发。

优点

  • 简化了组件之间的通信

  • 分离事件发送方和接收方

  • 使用UI工件(例如活动、片段)和后台线程表现良好

  • 避免复杂和容易出错的依赖关系和生命周期问题

  • 快;专为高性能而优化

  • 很小(< 50 k jar)

  • 1亿+安装的应用程序在实践中证明了这一点

  • 具有高级特性,如交付线程、订阅服务器优先级等。

快速开始

maven 引入

  [xml]
1
2
3
4
5
<dependency> <groupId>org.greenrobot</groupId> <artifactId>eventbus</artifactId> <version>3.1.1</version> </dependency>

定义

  • MessageEvent.java

信息的载体,最基础的 Java 类

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MessageEvent { private final String message; public MessageEvent(String message) { this.message = message; } public String getMessage() { return message; } }
  • EventService.Java

这个类,使用了 @Subscribe 指定监听方法,且指定了注册监听和取消监听的方法。

备注

上述方法的指定,在 Event3 中,对方法名称无要求。

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class EventService { /** * This method will be called when a MessageEvent is posted * @param event 事件 */ @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { System.out.println("on message of event"+event.getMessage()); } /** * 开始监听 */ public void startListen() { EventBus.getDefault().register(this); } /** * 停止监听 */ public void stopListen() { EventBus.getDefault().unregister(this); } }
  • Main.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main { public static void main(String[] args) { MessageEvent event = new MessageEvent("Event bus msg"); EventService eventService = new EventService(); eventService.startListen(); System.out.println("Start Listen..."); EventBus.getDefault().post(event); EventBus.getDefault().post(event); System.out.println("Stop Listen..."); eventService.stopListen(); EventBus.getDefault().post(event); } }

测试结果:

  [plaintext]
1
2
3
4
5
6
Start Listen... on message of eventEvent bus msg on message of eventEvent bus msg Stop Listen... [FINE] No subscribers registered for event class com.github.houbb.jdk.eventbus.domain.MessageEvent [FINE] No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent