1 Emitter概述
Emiter提供了在同一进程不同线程间或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。使用Emitter需要先导入以下模块:
|------------------------------------------------------------------|
| import { emitter } from '@kit.BasicServicesKit'; |
Emiter主要提供订阅、取消订阅、发送事件3项操作。
1.1 订阅
订阅操作包括以下接口:
(1)on(event:InnerEvent,callback:Callback<EventData>):持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。
(2)on(eventld:string,callback:Callback<EventData>):持续订阅指定事件,并在接收到该事件时,执行对应的回调处理函数。
(3)on<T>(eventld:string,callback:Callback<GenericEventData<T>>):持续订阅指定事件,并在接收到该事件时,执行对应的回调处理函数
(4)once(event:InnerEvent,callback:Callback<EventData>):单次订阅指定的事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。
(5)once(eventld:string,callback:Callback<EventData>):单次订阅指定事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。
(6)once<T>(eventld:string,callback:Callback<GenericEventData<T>>):单次订阅指定事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。
1.2 取消订阅
取消订阅操作包括以下接口:
(1)off(eventld:number):取消针对该事件ID的订阅。
(2)off(eventld:string):取消订阅指定事件。
(3)off(eventld:number, callback: Callback<EventData>):取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。
(4)off(eventld: string,callback:Callback<EventData>):取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。
(5)off<T>(eventld: string, callback: Callback<GenericEventData<T>>):取消针对该事件ID的订阅,传入可选参数callback,如果该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。
1.3 发送事件
发送事件操作包括以下接口:
emit(event: InnerEvent,data?: EventData):发送指定的事件。
emit(eventld: string,data?:EventData):发送指定的事件。
emit<T>(eventld: string,data?: GenericEventData<T>):发送指定的事。
emit(eventld:string,options:Options,data?:EventData):发送指定优先级事件。
emit<T>(eventId: string,options: Options, data?: GenericEventData<T>):发送指定优先级事件。
2 实战:线程间通信App(使用Emitter)
本节主要演示如何实现使用Emitter来订阅、发送事件。
打开DevEco Studio,选择一个Empty Ability工程模板,创建一个工程案例。
2.1 添加按钮
在Index.ets的Text组件下,添加2个按钮,代码如下:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| // 导入Emitter import { emitter } from '@kit.BasicServicesKit'; @Entry @Component struct Index { @State message: string = '线程间通信APP' // 用于接收事件数据 @State eventData: string = '' // 定义一个eventId为1的事件 private event: emitter.InnerEvent = { eventId: 1 }; build() { Row() { Column() { Text(this .message) .fontSize(25) .fontWeight(FontWeight.Bold) // 订阅事件 Button(('订阅事件'), { type: ButtonType.Capsule }) .fontSize(40) .fontWeight(FontWeight.Medium) .margin({ top: 10, bottom: 10 }) .onClick(() => { this .subscriberEvent() }) // 发送事件 Button(('发送事件'), { type: ButtonType.Capsule }) .fontSize(40) .fontWeight(FontWeight.Medium) .margin({ top: 10, bottom: 10 }) .onClick(() => { this .emitEvent() }) } .width('100%') } .height('100%') } } |
这些按钮都设置了onClick单击事件,分别来触发"订阅事件"和"发送事件"的操作。
界面效果如图所示:

2.2 添加Text组件显示接收的事件
为了能显示接收到的事件的信息,在2个按钮下面添加一个Text组件,代码如下:
|--------------------------------------------------------------------------------------------------------------------------------|
| // 用于接收事件数据 @State eventData: string = '' // 接收到的事件数据 Text(this .eventData) .fontSize(25) .fontWeight(FontWeight.Bold) |
Text组件的显示内容,通过@State绑定了eventData变量。当evenData变量变化时,Text的显示内容也会实时更新。
2.3 设置按钮单击事件方法
2个按钮的单击事件方法如下:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| // 订阅事件 private subscriberEvent() { // 收到eventId为1的事件后执行该回调 let callback = (eventData: emitter.EventData): void => { // 接收到事件 this .eventData = "subscribe event success: " + JSON.stringify(eventData); }; // 订阅eventId为1的事件 emitter.on(this .event, callback); this .message = "订阅者已创建"; } // 发送事件 private emitEvent() { let eventData: emitter.EventData = { data: { content: '鸿蒙生态', id: 1, isEmpty: false } }; // 发送eventId为1的事件,事件内容为eventData emitter.emit(this .event, eventData); } |
其中,subscriberEvent()方法用于订阅事件,emitEvent()方法用于发送事件。
2.4 运行
单击"订阅事件"界面后效果如图所示:

单击"发送事件"按钮后界面效果如图所示:

可以看到,Emiter已经能够正确接收事件,并将事件的信息显示在页面上了,可以实现应用不同线程间的通信。
3 小结
本文围鸿蒙Emitter展开,系统讲解其在同一进程不同线程/同线程内发送、处理事件的能力,通过"理论+实战"结合的方式,展现其"轻量、灵活、跨线程通信"的简单易用特性,助力开发者快速掌握进程内通信核心技能。