一、简介
EventBus是一个基于发布订阅的事件总线,在Java和Android里都可以使用。

作为一个消息总线,有三个主要的元素:
- Event:事件
- Subscriber:事件订阅者,接收特定的事件;有onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync这四个方法,分别对应不同的处理模式;
- Publisher:事件发布者,用于通知Subscriber有事件发生
事件处理有4种模式:
- PostThread:事件的处理在和事件的发送在相同的进程,所以事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。
- MainThread: 事件的处理会在UI线程中执行。事件处理时间不能太长,这个不用说的,长了会ANR的,对应的函数名是onEventMainThread。
- BackgroundThread:事件的处理会在一个后台线程中执行,对应的函数名是onEventBackgroundThread,虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件,如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。
- Async:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。适合于长时间的后台网络请求。
二、使用
1.引入pom
1 2 3 4 5 |
<dependency> <groupId>org.greenrobot</groupId> <artifactId>eventbus</artifactId> <version>3.1.1</version> </dependency> |
2.定义事件监听类
1 2 3 4 5 6 7 8 |
@Component @Slf4j public class EventListener { @Subscribe public void onMessageEvent(String event) { log.info("Subscribe message:{}", event); } } |
3.EventBusConfig
1 2 3 4 5 6 7 8 9 |
@Configuration public class EventBusConfig { @Bean public EventBus eventBus(){ return new EventBus(); } } |
4.EventHandler
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 |
@Component @Slf4j public class EventHandler { @Autowired private EventBus eventBus; @Autowired private EventListener eventListener; @PostConstruct public void init() { eventBus.register(eventListener); } @PreDestroy public void destroy() { eventBus.unregister(eventListener); } public void eventPost(){ eventBus.post("test"); log.info("post event"); } } |
5.测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@RunWith(SpringRunner.class) @SpringBootTest public class EventBusTest { @Autowired private EventHandler eventHandler; @Test public void postEvent(){ eventHandler.eventPost(); } } |
6.运行结果
三、自定义事件
上面的例子,我们发送和接收的都是string,如果我想event是个bean,怎么操作?
1.添加MessageEvent类
1 2 3 4 5 6 7 8 |
@Data @Builder public class MessageEvent { private Integer id; private String name; } |
2.修改EventHandler里的eventPost方法(红色字体部分)
1 2 3 4 |
public void eventPost(){ eventBus.post(MessageEvent.builder().id(1).name("test").build()); log.info("post event"); } |
3.修改EventListener类里的onMessageEvent方法(红色字体部分)
1 2 3 4 |
@Subscribe public void onMessageEvent(MessageEvent event) { log.info("Subscribe message:{}", event); } |
4.运行测试类,查看结果
1 2 |
2019-11-01 22:53:24.273 INFO 2252 --- [ main] com.sww.bizhi.eventbus.EventListener : Subscribe message:MessageEvent(id=1, name=test) 2019-11-01 22:53:24.278 INFO 2252 --- [ main] com.sww.bizhi.eventbus.EventHandler : post event |
四、最后
本篇初步介绍了如何在springboot里使用eventbus,下一篇文章将介绍如何集成spring-boot-starter-guava-eventbus
EventBus地址:https://github.com/greenrobot/EventBus
另外,本篇教程使用了lombok插件。
本文系本人原创,如要转载,请注明出处!
0
有点简单