鸿蒙中 emitter的原理

张开发
2026/4/17 16:08:07 15 分钟阅读

分享文章

鸿蒙中 emitter的原理
鸿蒙HarmonyOS中‌Emitter‌ 是一种轻量级的‌事件通信机制‌基于‌发布/订阅模式‌主要用于‌同一进程内的线程间或模块间异步通信‌。它不适用于跨进程通信IPC后者应使用commentEventManager或其他机制。核心原理‌事件队列机制‌Emitter 内部维护一个‌先进先出FIFO的事件队列‌所有通过emit发布的事件按顺序串行处理。‌异步非阻塞‌事件发布是异步的不会阻塞当前线程回调函数在事件被分发时执行。‌线程安全‌设计上支持主线程UI线程与 Worker 线程后台线程之间的安全通信无需手动加锁。‌解耦通信‌事件生产者与消费者无需直接引用仅通过事件标识eventId进行关联。相关接口方法作用特点on(event, callback)持续订阅事件需手动调用off取消once(event, callback)单次订阅事件触发后自动取消emit(event, data)发布事件可携带数据但‌不支持复杂对象‌如带State装饰器的对象off(eventId,callback)取消订阅防止内存泄漏建议在组件销毁时调用示例代码// 订阅 emitter.on({ eventId: 1001 }, (data) { console.log(收到:, data); }); // 发布 emitter.emit({ eventId: 1001 }, { message: Hello from Emitter }); // 单次订阅 emitter.once(login_success, () { /* 只执行一次 */ });适用场景‌跨线程通信‌如 Worker 线程完成任务后通知主线程更新 UI。‌模块解耦‌多个无关组件对同一事件响应如网络状态变化、用户登出。‌非关联组件通信‌避免通过 props 逐层传递数据。注意事项‌仅限进程内‌不能用于跨进程通信 ‌。‌避免耗时操作‌回调中若执行同步阻塞逻辑会阻塞后续事件处理 ‌。‌必须取消订阅‌长期订阅未释放可能导致内存泄漏建议配合组件生命周期管理 ‌。‌数据限制‌不支持传递包含State、Observed等响应式装饰器的对象 ‌与其他通信机制对比机制适用范围特点‌Emitter‌同一进程内跨线程/同线程异步、事件队列、支持优先级‌EventHub‌同一线程内如 UI 组件间同步、立即执行、自动管理生命周期Stage 模型‌‌commentEventManager‌跨进程 / 应用间系统级通信用于卡片、服务等 ‌

更多文章