鸿蒙开发EventBus原理及使用方式
本文主要讲解鸿蒙(HarmonyOS)中的EventBus,实现EventBus主要基于鸿蒙系统事件机制的一部分“Emitter ”。Emitter 是事件驱动编程模型中的一个核心概念,主要用于组件间通信或跨设备事件传递。在很多复杂的场景中,我们都有机会使用EventBus去通信,它可以实现组件之间的非直接通信,允许不同的组件在不了解彼此具体实现的情况下进行事件的发送和接收。它可以用于实现组件之间的解耦,比如在一个复杂的应用中,不同页面或模块之间可以通过EventBus来传递状态变化、通知等信息。
本文侧重对该技巧的使用,接下来我们围绕多个方面对Emitter进行一个简单的了解:
一、基本概念
-
Emitter(发射器) 是鸿蒙系统事件机制的一部分,通常与 Listener(监听器) 配合使用,形成发布-订阅模式。
-
它允许组件(或设备)通过事件(Event)进行解耦通信:一个组件触发事件(Emitter),其他订阅该事件的组件(Listener)会接收并处理。
二、在鸿蒙中的具体作用
-
跨组件通信:例如,UI组件(按钮)触发点击事件,逻辑层通过监听Emitter做出响应。
-
分布式事件传递:在鸿蒙的分布式架构中,Emitter可将事件跨设备传递(如手机触发事件,电视接收并响应)。
-
异步任务处理:结合事件队列,实现非阻塞的任务调度。
三、创建工具
1、我们首先应该在工具类文件里面创建一个基于Emitter的事件通知工具,这一步关系到了我们是否能够调用成功。一个完整的EventBus应该包含三个部分,分别是发送、监听、卸载。
发送:

监听:

卸载:

完整的代码如下:
import { emitter } from '@kit.BasicServicesKit';
/// 事件通知工具类
export abstract class EventBus {
static send(
eventID: string,
eventData?: Object | Record<string, Object> | object[]
) {
let data: string | undefined;
if (eventData !== null && eventData !== undefined) {
if (typeof eventData === 'string') {
data = eventData;
} else {
data = JSON.stringify(eventData);
}
}
emitter.emit(
eventID,
{
priority: emitter.EventPriority.HIGH
},
{
data: {
'data': data
}
}
);
}
static listen<T>(
eventID: string,
callback: (data?: T) => void
) {
emitter.on(
eventID,
(eventData: emitter.EventData) => {
let data: string | undefined = eventData.data!['data'];
if (data == undefined) {
callback(undefined);
} else {
if (data.startsWith('{') && data.endsWith('}')) {
callback(JSON.parse(data) as T);
} else {
callback(data as T);
}
}
}
);
}
static cancel(eventID: string) {
emitter.off(eventID);
}
}
这些基本上能够满足大多数数据传递的需求,如果有特殊的数据格式需要传递,可以自己稍作更改。
四、具体使用
简单来说就是发送——订阅——卸载。特别注意卸载,不正常卸载可能会造成内存泄漏,这一步尤为重要。另外事件冲突也是导致我们容易出现问题的一个环境,这里我建议用一个单独的文件去储存我们需要用到的事件名称:

接下来就是正常的发送和订阅
发送:
![]()
订阅:

五:总结
总结来看,鸿蒙的 Emitter 是实现高效、解耦通信的核心工具,尤其在分布式场景下,简化了跨设备交互的复杂性。如需深入技术细节,可参考鸿蒙官方文档。有任何疑问和问题都可以在评论区指出~
更多推荐



所有评论(0)