鸿蒙 emitter 和 eventHub 的区别
在鸿蒙(HarmonyOS)开发中,Emitter
和EventHub
是两种不同的事件通信机制,主要区别如下:
一、核心功能区别
特性 | Emitter | EventHub |
---|---|---|
通信范围 | 支持跨线程通信(如主线程与Worker线程) | 仅限线程内通信(如UIAbility内组件间通信) |
事件优先级 | 支持配置事件优先级(如IMMEDIATE、LOW) | 无优先级设置 |
订阅类型 | 支持持续订阅(on )和单次订阅(once ) | 仅支持持续订阅(on ) |
数据约束 | 需封装为EventData 对象,支持复杂数据类型 | 可传递任意类型参数(...args: Object[] ) |
二、适用场景
-
Emitter:
- 需要跨线程通信的场景(如主线程与Worker线程交互)。
- 需要控制事件投递优先级(如高优先级事件优先处理)。
- 与HarmonyOS的Worker能力配合使用。
-
EventHub:
- 同线程内组件间通信(如UIAbility与Page、Page与组件)。
- 轻量级事件传递,无需复杂配置。
- Stage模型中通过UIAbility的
context.eventHub
直接获取。
三、使用方式对比
1. Emitter示例
// 订阅事件(跨线程)
import { emitter } from '@kit.BasicServicesKit';// 定义事件及优先级
let event: emitter.InnerEvent = { eventId: 1, priority: emitter.EventPriority.LOW };
// 订阅事件
emitter.on(event, (eventData: emitter.EventData) => {console.info(`Received data: ${JSON.stringify(eventData)}`);
});// 发送事件(可在不同线程中调用)
let eventData: emitter.EventData = { data: { content: "Hello" } };
emitter.emit(event, eventData);
2. EventHub示例
// 在UIAbility中订阅事件(同线程)
import { UIAbility } from '@kit.AbilityKit';export default class EntryAbility extends UIAbility {onCreate() {this.context.eventHub.on('myEvent', (data: string) => {promptAction.showToast({ message: data });});}// 发送事件triggerEvent() {this.context.eventHub.emit('myEvent', 'EventHub Message');}
}
四、其他区别
- 模型支持:
EventHub
仅支持Stage模型,通过context
获取。Emitter
支持FA和Stage模型,且适用于Worker线程。
- 资源消耗:
Emitter
因支持跨线程和优先级队列,资源占用较高。EventHub
更轻量,适合高频次、简单的通信场景。
总结建议
- 跨线程通信或需优先级控制 → 选择
Emitter
。 - 同线程组件解耦或简单事件传递 → 使用
EventHub
。