写点什么

在鸿蒙中如何进行线程通信

作者:Geek_b896c3
  • 2025-05-20
    广东
  • 本文字数:1704 字

    阅读完需:约 6 分钟

如何进行线程通信,一般有两个方法

emitter 线程间通信- 同一个项目下 随意通信

Emitter 是一种作用在进程内的事件处理机制,为应用程序提供订阅事件、发布事件、取消事件订阅的能力。

场景介绍

Emitter 用于同一进程内相同线程或不同线程间的事件处理,事件异步执行。使用时需要先订阅一个事件,然后发布该事件,发布完成后 Emitter 会将已发布的事件分发给订阅者,订阅者就会执行该事件订阅时设置的回调方法。当不需要订阅该事件时应及时取消订阅释放 Emitter 资源。

在首页发送

import { common } from '@kit.AbilityKit';import { emitter } from '@kit.BasicServicesKit';
@Entry@Componentstruct EventHubCase { @State message: string = 'Hello World';
aboutToAppear(): void { emitter.emit("message", () => { this.message = '我发起你的消息了' }) }
build() { RelativeContainer() { Text(this.message) .id('EventHubCaseHelloWorld') .fontSize(50) .fontWeight(FontWeight.Bold) .alignRules({ center: { anchor: '__container__', align: VerticalAlign.Center }, middle: { anchor: '__container__', align: HorizontalAlign.Center } }) Button("通信") .onClick(() => { emitter.emit("message") })
Button("拉起另外一个窗口") .onClick(() => { const ctx = getContext() as common.UIAbilityContext ctx.startAbility({ bundleName: 'xxx', abilityName: 'Pay' })
}) .margin({ left: 200 })
} .height('100%') .width('100%') }}
@Componentstruct ChildCase { aboutToAppear(): void { emitter.on("message", () => { AlertDialog.show({ message: '我收到你的消息' }) }) }
build() {
}}
复制代码

eventHub 线程内通信- 同一个窗口中随意通信

基于当前的应用模型,可以通过以下几种方式来实现 UIAbility 组件与 UI 之间的数据同步。

  • 使用 EventHub 进行数据通信:在基类 Context 中提供了 EventHub 对象,可以通过发布订阅方式来实现事件的传递。在事件传递前,订阅者需要先进行订阅,当发布者发布事件时,订阅者将接收到事件并进行相应处理。

  • 使用 EventHub 进行数据通信

    EventHub 为 UIAbility 组件提供了事件机制,使它们能够进行订阅、取消订阅和触发事件等数据通信能力。

import { common } from '@kit.AbilityKit';import { emitter } from '@kit.BasicServicesKit';
@Entry@Componentstruct EventHubCase { @State message: string = 'Hello World';
aboutToAppear(): void { getContext().eventHub.on("message", () => { this.message = "我起飞了" }) }
build() { RelativeContainer() { Text(this.message) .id('EventHubCaseHelloWorld') .fontSize(50) .fontWeight(FontWeight.Bold) .alignRules({ center: { anchor: '__container__', align: VerticalAlign.Center }, middle: { anchor: '__container__', align: HorizontalAlign.Center } }) Button("通信") .onClick(() => { getContext().eventHub.emit("message") emitter.emit("message") })
Button("拉起另外一个窗口") .onClick(() => { const ctx = getContext() as common.UIAbilityContext ctx.startAbility({ bundleName: 'xxx', abilityName: 'Pay' })
}) .margin({ left: 200 })
} .height('100%') .width('100%') }}
@Componentstruct ChildCase { aboutToAppear(): void { getContext().eventHub.on("message", () => { AlertDialog.show({ message: '我收到你起飞的消息' }) }) }
build() {
}}
复制代码


用户头像

Geek_b896c3

关注

还未添加个人签名 2025-05-06 加入

还未添加个人简介

评论

发布
暂无评论
在鸿蒙中如何进行线程通信_鸿蒙_Geek_b896c3_InfoQ写作社区