EventBus

与OTTO比较

和Otto相比, EventBus主要有3点不同:

1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在 Android 4.0之前 的版本中,注解解析起来比较慢 , 事件响应函数默认以“onEvent”开始,可以在EventBus中修改这个值,但是不推荐这么干
2. 事件响应有更多的线程选择
EventBus可以向不同的线程中发布事件,在ThreadMode 枚举中定义了4个线程,只需要在事件响应函数名称“onEvent”后面添加对应的线程类型名称,则还事件响应函数就会在对应的线程中执行,比如事件函数“onEventAsync”就会在另外一个异步线程中执行,ThreadMode定义的4个线程类型如下:
PostThread :事件响应函数和事件发布在同一线程中执行。这个是默认值,这样可以避免线程切换。
MainThread :事件响应函数会在Android应用的主线程(大部分情况下都是UI线程)中执行。
BackgroundThread :事件响应函数会在一个后台线程中执行。如果事件发布函数不是在主线程中,则会立即在事件发布线程中执行响应函数。如果事件发布函数在主线程中,EventBus则会在唯一的一个后台线程中按照顺序来执行所有的后台事件响应函数。

上面的3种事件响应函数,应该能够很快的执行完,不然的话会阻塞各自的事件发布。

async:事件响应函数在另外一个异步线程中执行。该线程和发布线程、主线程相互独立。如果事件响应函数需要较长的时间来执行,则应该使用该模式,例如 网络访问等。需要注意的是,由于系统并行的限制,应该避免在同一时间触发大量的异步线程。 EventBus使用一个线程池来提高线程的效率。

3. EventBus支持 Sticky Event

有时候某个事件可能会用到多次,比如在前面介绍Event Bus模型一文的示例中,最新的位置更新信息,可能需要多次用到,真对这种情况,您可以把该事件发布为Sticky Event,然后,当需要查询该信息的时候,可以通过Bus的getStickyEvent(ClasseventType) 函数来查询最新发布的Event对象。
同一类型的事件只保存最新的Event对象。
注册和发布事件的函数分别为 registerSticky(…) 和 postSticky(Object event)
项目主页上还有和Otto之间性能对比的表格,以及性能测试的源码。

EventBus原理

内部维护一张hashmap,key与类名有关的Strigng,value是List<SubscriberMethod>,就是该类里面与OnEvent相关的方法

参考资料

### EventBus 在编程中的使用和实现 EventBus 是一种用于简化事件驱动架构的工具,它允许组件之间通过发布-订阅模式进行通信。以下是关于 EventBus 的详细信息以及其实现方式: #### 什么是 EventBusEventBus 是一种设计模式的实现,通常用于解耦发布者和订阅者之间的直接依赖关系。它允许一个或多个订阅者监听特定类型的事件,并在这些事件发生时执行相应的操作[^1]。 #### EventBus 的主要特性 - **发布-订阅模式**:发布者将事件发送到总线,而订阅者从总线接收事件。 - **解耦**:发布者不需要知道哪些订阅者会处理事件,反之亦然。 - **异步支持**:某些实现允许事件以异步方式处理,从而提高性能。 #### 常见的 EventBus 实现 以下是一些常见的 EventBus 库及其用法示例: ##### 1. Guava EventBus Google 提供的 Guava 库中包含了一个简单的 EventBus 实现。 ```java // 创建 EventBus 实例 EventBus eventBus = new EventBus(); // 定义事件处理器 public class MyEventHandler { @Subscribe public void handleMyEvent(MyEvent event) { System.out.println("Received event: " + event.getMessage()); } } // 发布事件 eventBus.register(new MyEventHandler()); eventBus.post(new MyEvent("Hello, EventBus!")); ``` ##### 2. Vert.x EventBus Vert.x 是一个基于 JVM 的工具包,支持分布式事件总线。 ```java // 创建 Vert.x 实例 Vertx vertx = Vertx.vertx(); // 注册消息处理器 vertx.eventBus().consumer("my.address", message -> { System.out.println("Received message: " + message.body()); }); // 发送消息 vertx.eventBus().send("my.address", "Hello from Vert.x!"); ``` ##### 3. Otto (现已停止维护) Otto 是 Square 公司开发的一个轻量级事件总线库。 ```java // 创建 EventBus 实例 Bus bus = new Bus(); // 定义事件处理器 public class MySubscriber { @Subscribe public void handleMessage(MyEvent event) { System.out.println("Received message: " + event.message); } } // 注册订阅者并发布事件 bus.register(new MySubscriber()); bus.post(new MyEvent("Hello, Otto!")); ``` #### 使用场景 - **UI 事件处理**:在 GUI 应用程序中,EventBus 可以用来解耦视图和控制器。 - **微服务通信**:在微服务架构中,EventBus 可以作为服务间通信的一种方式[^2]。 - **插件系统**:在需要动态加载模块的系统中,EventBus 可以帮助模块之间进行松散耦合的通信。 #### 注意事项 - **性能问题**:对于高频率的事件,EventBus 可能会导致性能下降。 - **调试困难**:由于发布者和订阅者之间没有直接联系,调试可能会变得复杂。 - **内存泄漏**:未正确注销的订阅者可能导致内存泄漏。 ```python # 示例:Python 中的简单 EventBus 实现 class EventBus: def __init__(self): self.subscribers = {} def subscribe(self, event_type, handler): if event_type not in self.subscribers: self.subscribers[event_type] = [] self.subscribers[event_type].append(handler) def publish(self, event_type, event): if event_type in self.subscribers: for handler in self.subscribers[event_type]: handler(event) # 使用示例 def handle_event(event): print(f"Handling event: {event}") bus = EventBus() bus.subscribe('my_event', handle_event) bus.publish('my_event', 'Hello, Python EventBus!') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值