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

相关推荐
想吃火锅100531 分钟前
【leetcode】1.两数之和js版
javascript·算法·leetcode
net3m331 小时前
一阶软件低通滤波器算法
人工智能·算法
Davina_yu1 小时前
弹窗交互:AlertDialog与CustomDialog的创建与关闭(11)
harmonyos·鸿蒙·鸿蒙系统
水木流年追梦2 小时前
大模型入门-大模型优化方法12-YaRN 长文本外推技术
人工智能·分布式·算法·正则表达式·prompt
90后的晨仔2 小时前
HarmonyOS 锁屏音频播放完整实践指南
harmonyos
90后的晨仔2 小时前
鸿蒙应用动态桌面图标功能实现完全指南
harmonyos
nashane2 小时前
HarmonyOS 6学习:JsCrash“闪退”法医指南——从FaultLog堆栈还原崩溃现场的终极手册
学习·华为·harmonyos
J-Tony112 小时前
【JVM】三色标记法
java·jvm·算法
wengad2 小时前
机器学习实践理论基础|算法、模型和数据集
人工智能·算法·机器学习