HarmonyOS App开发 ——线程间通信App开发

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展开,系统讲解其在同一进程不同线程/同线程内发送、处理事件的能力,通过"理论+实战"结合的方式,展现其"轻量、灵活、跨线程通信"的简单易用特性,助力开发者快速掌握进程内通信核心技能。

相关推荐
样例过了就是过了16 小时前
LeetCode热题100 矩阵置零
算法·leetcode·矩阵
一行代码改三天17 小时前
奖学金+回文数2+加法器
算法
33三 三like17 小时前
高精度计算
开发语言·c++·算法
敲代码的哈吉蜂17 小时前
haproxy的算法——混合算法
linux·运维·服务器·算法
星空222317 小时前
【HarmonyOS】day39:React Native实战项目+智能文本省略Hook开发
react native·华为·harmonyos
追随者永远是胜利者17 小时前
(LeetCode-Hot100)283. 移动零
java·算法·leetcode·职场和发展·go
We་ct17 小时前
LeetCode 129. 求根节点到叶节点数字之和:两种解法详解(栈+递归)
前端·算法·leetcode·typescript
郝学胜-神的一滴17 小时前
Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践
开发语言·数据结构·c++·python·算法
流云鹤17 小时前
动态规划01
算法·动态规划
SmartBrain17 小时前
技术总结:VLLM部署Qwen3模型的详解
开发语言·人工智能·算法·vllm