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

相关推荐
熊猫钓鱼>_>9 小时前
【开源鸿蒙跨平台开发先锋训练营】Day 19: 开源鸿蒙React Native动效体系构建与混合开发复盘
react native·华为·开源·harmonyos·鸿蒙·openharmony
只是懒得想了9 小时前
C++实现密码破解工具:从MD5暴力破解到现代哈希安全实践
c++·算法·安全·哈希算法
2601_949593659 小时前
基础入门 React Native 鸿蒙跨平台开发:BackHandler 返回键控制
react native·react.js·harmonyos
m0_736919109 小时前
模板编译期图算法
开发语言·c++·算法
mocoding9 小时前
使用Flutter强大的图标库fl_chart优化鸿蒙版天气预报温度、降水量、湿度展示
flutter·华为·harmonyos
dyyx1119 小时前
基于C++的操作系统开发
开发语言·c++·算法
m0_736919109 小时前
C++安全编程指南
开发语言·c++·算法
蜡笔小马9 小时前
11.空间索引的艺术:Boost.Geometry R树实战解析
算法·r-tree
-Try hard-9 小时前
数据结构:链表常见的操作方法!!
数据结构·算法·链表·vim
2301_7903009610 小时前
C++符号混淆技术
开发语言·c++·算法