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

相关推荐
汀、人工智能13 分钟前
[特殊字符] 第27课:环形链表II
数据结构·算法·链表·数据库架构··环形链表ii
会编程的土豆13 分钟前
【数据结构与算法】二叉树大总结
数据结构·算法·leetcode
沉鱼.4423 分钟前
第十届题目
算法
y = xⁿ25 分钟前
【LeetCode Hot100】动态规划:T70:爬楼梯 T118:杨辉三角形 T198:打家劫舍
算法·leetcode·动态规划
Liangwei Lin27 分钟前
洛谷 P1460 [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins
数据结构·算法
汀、人工智能30 分钟前
02 - 变量与数据类型
数据结构·算法·链表·数据库架构··02 - 变量与数据类型
hello!树32 分钟前
函数极限的概念和性质
算法
人道领域37 分钟前
【LeetCode 刷题日】19.删除链表的倒数第n个节点
算法·leetcode·链表
小白zlm39 分钟前
连续系统-离散系统的转换
算法·嵌入式·电机控制·pmsm
py有趣39 分钟前
力扣热门100题之最大子数组和
算法·leetcode