在Google Guava 10版本引入了EventBus, 它主要用来简化我们处理生产/消费者编程模型.
基本用法
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可:
- public class EventListener {
- public int lastMessage = 0;
- @Subscribe
- public void listen(OurTestEvent event) {
- lastMessage = event.getMessage();
- }
- public int getLastMessage() {
- return lastMessage;
- }
- }
上面的lastMessage用来接收消息.
下面定义的类用来对消息进行封装:
- public class OurTestEvent {
- private final int message;
- public OurTestEvent(int message) {
- this.message = message;
- }
- public int getMessage() {
- return message;
- }
- }
通过写一个测试来了解EventBus如何工作:
- @Test
- public void shouldReceiveEvent() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- EventListener listener = new EventListener();
- eventBus.register(listener);
- // when
- eventBus.post(new OurTestEvent(200));
- // then
- assertThat(listener.getLastMessage()).isEqualTo(200);
- }
上面的测试是不是很简单?
MultiListener的使用
只需要在要订阅消息的方法上加上@Subscribe注解即可实现对多个消息的订阅:
- public class MultipleListener {
- public Integer lastInteger;
- public Long lastLong;
- @Subscribe
- public void listenInteger(Integer event) {
- lastInteger = event;
- }
- @Subscribe
- public void listenLong(Long event) {
- lastLong = event;
- }
- public Integer getLastInteger() {
- return lastInteger;
- }
- public Long getLastLong() {
- return lastLong;
- }
- }
下面是对应的测试:
- @Test
- public void shouldReceiveMultipleEvents() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- MultipleListener multiListener = new MultipleListener();
- eventBus.register(multiListener);
- // when
- eventBus.post(new Integer(100));
- eventBus.post(new Long(800));
- // then
- assertThat(multiListener.getLastInteger()).isEqualTo(100);
- assertThat(multiListener.getLastLong()).isEqualTo(800L);
- }
高级用法
1.Dead Event
如果EventBus发送的消息都不是订阅者关心的称之为Dead Event. 看下面的例子:
- /**
- * Listener waiting for the event that any message was posted but not delivered to anyone
- */
- public class DeadEventListener {
- boolean notDelivered = false;
- @Subscribe
- public void listen(DeadEvent event) {
- notDelivered = true;
- }
- public boolean isNotDelivered() {
- return notDelivered;
- }
- }
下面是测试类:
- @Test
- public void shouldDetectEventWithoutListeners() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- DeadEventListener deadEventListener = new DeadEventListener();
- eventBus.register(deadEventListener);
- // when
- eventBus.post(new OurTestEvent(200));
- assertThat(deadEventListener.isNotDelivered()).isTrue();
- }
如果没有消息订阅者监听消息, EventBus将发送DeadEvent消息, 这时我们可以通过log的方式来记录这种状态.
2.Event的继承
如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息
看下面的例子:
- public class NumberListener {
- private Number lastMessage;
- @Subscribe
- public void listen(Number integer) {
- lastMessage = integer;
- }
- public Number getLastMessage() {
- return lastMessage;
- }
- }
- public class IntegerListener {
- private Integer lastMessage;
- @Subscribe
- public void listen(Integer integer) {
- lastMessage = integer;
- }
- public Integer getLastMessage() {
- return lastMessage;
- }
- }
对应的测试类:
- @Test
- public void shouldGetEventsFromSubclass() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- IntegerListener integerListener = new IntegerListener();
- NumberListener numberListener = new NumberListener();
- eventBus.register(integerListener);
- eventBus.register(numberListener);
- // when
- eventBus.post(new Integer(100));
- // then
- assertThat(integerListener.getLastMessage()).isEqualTo(100);
- assertThat(numberListener.getLastMessage()).isEqualTo(100);
- //when
- eventBus.post(new Long(200L));
- // then
- // this one should has the old value as it listens only for Integers
- assertThat(integerListener.getLastMessage()).isEqualTo(100);
- assertThat(numberListener.getLastMessage()).isEqualTo(200L);
- }
相关推荐
EventBus是google的一个Java工具包其中的一个工具类,类似的有多个版本其中包括移植到Android端的 和改良的,功能基本都是一样的。此处主要是对Guava版的EventBus分析,关于。 ###2. 功能简介 ####2.1 EventBus介绍 ...
├─Google Guava 第19讲-Guava之EventBus和NIO2.0 WatchService综合实战.wmv ├─Google Guava 第20讲-实战:手动实现一个EventBus-01快速搭建程序结构.wmv ├─Google Guava 第21讲-实战:手动实现一个EventBus-...
汪文君Google Guava 代码。Guava之函数式接口、Guava EventBus源码剖析以及优缺点总结
Guava是Google公司开发的一款适用于Java的工具类集合。
Guava:由Google提供的Java类库,提供了许多用于优化和提高开发效率的工具和组件,如Guava Cache(提供了缓存功能)、Guava EventBus(提供了事件总线功能)、Guava Cache(提供了缓存功能)等。 Spring Framework:...
它比 Google Guava的EventBus更快、更强大 {citation needed}。 什么是 ASM ASM是一个java库,提供实时的字节码修改和生成。 它的名字被称为内联汇编器, 虽然我认为是沙明丸绫的迷你裙…… AsmEventBus由ASM供电...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
它受Java库(来自Google的Guava eventbus)的启发。 但这与Guava事件总线库并不完全相同。 geeteventbus简化了来自发布者和订阅者的事件处理。 发布者和订阅者不需要创建线程来同时处理事件。 eventbus可以是...
EventBus是一个通用的叫法,例如Google出品的Guava,Guava是一个庞大的库,EventBus只是它附带的一个小功能,因此实际项目中使用并不多。用的最多的是greenrobot/EventBus,这个库的优点是接口简洁,集成方便,但是...
com.google.common.eventbus:发布订阅风格的事件总线。 com.google.common.hash: 哈希工具包。 com.google.common.io:I/O工具包。 com.google.common.math:原始算术类型和超大数的运算工具包。 ...
java安卓仿微信聊天软件源码 # 应用架构 类库 应用架构 应用架构采用 官方介绍 ...EventBus Dragger2依赖注入 PullToRefresh下拉刷新 开源日志库Logger Okhttp网络请求 okhttp网络日志拦截器 --图片加载框