当前位置: 首页 > article >正文

HarmonyOS ,你所不知道的事件发布/订阅的通信机制-EventEmitter

在鸿蒙HarmonyOS开发中EventEmitter 是一种用于事件发布/订阅的通信机制常用于组件、Ability、线程或模块之间的解耦通信。它允许一个对象发布者发出事件而其他对象订阅者可以监听并响应这些事件。核心概念与使用场景EventEmitter 的核心是观察者模式的实现。它适用于以下典型场景UIAbility 与 UI 页面之间的通信例如UIAbility 中的业务逻辑处理完成后通过事件通知 UI 页面更新。跨组件通信在复杂的页面中非父子关系的组件可以通过事件进行数据传递。线程间通信Worker 线程或 TaskPool 任务完成后通过事件通知主线程。原生Native/ArkTS与 JavaScript如 React Native之间的通信在混合开发中用于两端的事件传递。主要实现方式在鸿蒙开发中根据不同的使用场景EventEmitter 有几种常见的实现方式1. 使用ohos.events.emitter模块系统基础服务这是鸿蒙系统提供的官方事件发射器功能强大支持跨线程、跨进程的事件通信。它提供了on订阅、emit发送、off取消订阅等核心方法。示例代码ArkTS// 导入基础服务Kit中的Emitter模块 import { emitter } from kit.BasicServicesKit; // 定义事件ID const EVENT_ID: string myEvent; // 订阅事件 emitter.on(EVENT_ID, (eventData: emitter.EventData) { console.log(收到事件数据${JSON.stringify(eventData.data)}); }); // 发送事件可以携带数据 emitter.emit(EVENT_ID, { Hello EventEmitter }); // 取消订阅通常在不需监听时调用例如组件销毁时 // emitter.off(EVENT_ID);特点系统能力需要SystemCapability.Notification.Emitter。跨线程/进程适用于更广泛的通信场景。强类型可以通过泛型GenericEventDataT指定事件数据的类型。2. 使用 UIAbility 的eventHub在 Stage 模型下每个 UIAbility 实例都拥有一个eventHub对象用于该 Ability 内部包括其所属的所有页面的事件通信。它是一种轻量级的线程内事件总线。示例代码结合 UIAbility 和 UI 页面// 在 UIAbility如 EntryAbility.ets中订阅事件 import { UIAbility } from kit.AbilityKit; export default class EntryAbility extends UIAbility { onCreate() { const eventHub this.context.eventHub; eventHub.on(dataLoaded, (string) { console.log(Ability收到数据${data}); }); } } // 在 UI 页面.ets 文件中发送事件 Entry Component struct Index { private context this.getUIContext().getHostContext() as common.UIAbilityContext; build() { Column() { Button(发送事件到Ability) .onClick(() { // 通过 eventHub 发送事件 this.context.eventHub.emit(dataLoaded, 数据来自UI页面); }) } } }特点作用域局限仅限于同一个 UIAbility 内不能跨 Ability 通信。无需导入直接通过 Ability 上下文 (context.eventHub) 访问。轻量高效适合 Ability 内部页面与逻辑的简单通信。3. 自定义 EventEmitter 类你也可以根据需求实现一个简单的 EventEmitter通常用于管理应用内的自定义事件或全局状态变更通知。示例代码自定义类class MyEventEmitter { private events: { [key: string]: Function[] } {}; // 订阅事件 on(event: string, callback: Function): void { if (!this.events[event]) { this.events[event] []; } this.events[event].push(callback); } // 发送事件 emit(event: string, ...args: any[]): void { if (this.events[event]) { this.events[event].forEach(callback { callback(...args); }); } } // 取消订阅 off(event: string, callback?: Function): void { if (!this.events[event]) return; if (!callback) { delete this.events[event]; } else { this.events[event] this.events[event].filter(cb cb ! callback); } } } // 使用示例 const myEmitter new MyEventEmitter(); myEmitter.on(test, (msg: string) { console.log(自定义事件${msg}); }); myEmitter.emit(test, Hello Custom Emitter);特点高度可控可以根据业务需求定制例如添加 once单次监听、错误处理等。应用内全局通常以单例模式导出供多个模块使用。4. 在 React Native 鸿蒙化RNOH开发中在 React Native 应用与鸿蒙原生ArkTS混合开发时EventEmitter 机制也用于两端通信。Native (ArkTS) 给 JS 发消息使用RNInstance的emitDeviceEvent方法。// ArkTS 侧发送事件 this.ctx.rnInstance.emitDeviceEvent(customEvent, { params: { key: value } });JS 侧监听使用DeviceEventEmitter。// React Native JS 侧监听事件 import { DeviceEventEmitter } from react-native; DeviceEventEmitter.addListener(customEvent, (e) { console.log(收到来自Native的事件:, e); });选择建议与注意事项作用域选择同一 UIAbility 内部通信优先使用eventHub。需要跨线程或更通用的场景使用ohos.events.emitter。全局应用状态管理或复杂事件流可考虑自定义 EventEmitter 或结合状态管理工具如 AppStorage。生命周期管理务必在组件或 Ability 销毁时例如aboutToDisappear或onDestroy取消事件订阅防止内存泄漏和无效回调。事件命名建议使用有明确意义的字符串常量作为事件 ID避免拼写错误和冲突。数据传递emit可以携带任意数据但建议保持数据结构的简单和可序列化便于调试和跨线程传递。EventEmitter 是鸿蒙开发中实现松耦合通信的重要工具根据具体场景选择合适的实现方式可以显著提升代码的可维护性和可扩展性。

相关文章:

HarmonyOS ,你所不知道的事件发布/订阅的通信机制-EventEmitter

在鸿蒙(HarmonyOS)开发中,EventEmitter 是一种用于事件发布/订阅的通信机制,常用于组件、Ability、线程或模块之间的解耦通信。它允许一个对象(发布者)发出事件,而其他对象(订阅者&a…...

FastAdmin旧版本CVE-2024-7928任意文件读取漏洞实战修复指南

1. 这个漏洞不是“能读任意文件”那么简单,而是整个权限体系的崩塌起点FastAdmin 是国内 PHP 后台开发领域使用率极高的开源框架,尤其在中小型企业定制化管理后台、政企内部系统、电商中台等场景中,大量项目仍基于 v1.3.x ~ v1.4.5 版本运行。…...

Unity ASE全屏风沙Shader实战:从光学建模到跨平台优化

1. 这不是“加个粒子就完事”的风沙——为什么全屏风沙在Unity里是个硬骨头“Unity之ASE实现全屏风沙效果”——看到这个标题,很多刚接触Shader Graph或Amplify Shader Editor(ASE)的美术向程序员第一反应是:“不就是叠个噪波UV动…...

Unity WebGL适配微信小游戏全链路指南

1. 为什么Unity WebGL不能直接扔进微信小游戏?——从“能跑”到“能上线”的认知断层很多人第一次尝试把Unity项目导出WebGL再塞进微信小游戏时,都会经历一个相似的困惑:本地浏览器里好好的3D场景,一放进微信开发者工具就白屏、报…...

UE5下载安装避坑指南:硬件驱动、VS环境与版本管理实战

1. 这不是“点几下就能好”的安装,而是UE5项目生命周期的第一次关键决策很多人点开Epic Games Launcher,看到那个醒目的“Install”按钮,下意识就点了下去——结果十分钟后卡在98%,或者装完打开编辑器直接报错“Failed to load mo…...

UE5安装避坑指南:从Launcher到C++编译的完整环境配置

1. 这不是“点下一步就行”的安装:UE5下载安装背后的真实门槛很多人第一次点开Epic Games官网,看到那个醒目的“Download Engine”按钮,下意识觉得:“不就是个游戏引擎安装包?跟装微信、装PS差不多,双击→下…...

Unity风格化木质道具包:模块化建模与多管线材质优化方案

1. 这个木质道具包到底解决了什么实际问题?在Unity项目开发中,尤其是独立游戏、原型验证或教育类场景里,“缺模型”是高频痛点。不是所有团队都有建模师,也不是每个项目都值得为几十个木头物件专门外包或花两周时间从零建模。我做…...

为什么你的ElevenLabs沪语输出像“洋泾浜”?资深ASR工程师用12组基频曲线图揭示声调失准根源

更多请点击: https://codechina.net 第一章:沪语语音合成的声调失准现象全景扫描 沪语(上海话)作为典型的吴语代表,具有复杂的连读变调系统与高辨义性声调特征,这使得其语音合成在声调建模环节极易出现系统…...

为什么你的ElevenLabs挪威语输出总被用户投诉“像AI朗读”?——基于217小时母语者A/B测试的5个声学参数调优阈值

更多请点击: https://intelliparadigm.com 第一章:挪威语语音“AI感”感知机制与母语者听觉认知模型 当挪威语母语者听到由现代TTS系统(如Coqui TTS或Azure Neural TTS)生成的挪威语语音时,常产生一种微妙的“AI感”—…...

解锁Midjourney大画幅秘密:3步实现电影级宽幅输出(含17组实测--ar 16:9至32:9全适配prompt模板)

更多请点击: https://codechina.net 第一章:Midjourney大画幅输出的核心原理与视觉范式 Midjourney的大画幅输出并非简单缩放像素,而是基于其扩散模型对高维潜在空间的结构化采样与语义一致性重合成。其核心依赖于隐式超分辨率(I…...

【限时公开】盐印相风格Prompt工程黑箱:3类被官方隐藏的--stylize权重阈值,97%用户从未触发过第3级胶片响应

更多请点击: https://codechina.net 第一章:盐印相风格Prompt工程的视觉本质解构 盐印相(Salted Paper Print)作为19世纪早期摄影工艺的代表,其视觉特征——柔和的颗粒质感、低对比度过渡、泛暖棕褐基调与微妙的纸基纤…...

农业信息智能化种植系统(10079)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

免费图片去水印工具在线网站有哪些?2026年图片水印去除APP和软件推荐

在日常工作和生活中,我们经常会遇到需要去除图片水印的情况。无论是为了社交媒体分享、内容创作还是素材整理,找到一款高效的免费去水印工具都能节省不少时间。本文将为你详细介绍2026年最实用的免费图片去水印工具,包括在线网站、手机APP和电…...

Unity接入Google Play Games完整避坑指南

1. 这不是“接个SDK”那么简单:为什么Unity项目接入Google Play Games常卡在第三步就崩了你肯定见过那种教程——标题写着“三分钟接入Google Play Games”,点进去第一行就是“下载插件、拖进Assets、调用PlayGamesPlatform.Activate()”,然后…...

免费图片去水印工具有哪些?2026年在线网站、APP软件完整盘点与推荐

处理图片水印已经成为很多工作和生活场景的常见需求。无论是自媒体运营者整理素材、设计师进行后期处理,还是普通用户保存喜欢的图片,找到一个好用的去水印工具都能显著提高效率。在2026年,市场上涌现出许多免费的图片去水印工具,…...

Unity中用Sentis部署YOLOv8 Nano实现移动端实时目标检测

1. 为什么是YOLOv8 Nano Sentis?不是ONNX Runtime,也不是TensorRT?去年在做一个AR巡检项目时,我卡在物体检测环节整整三周。客户要求在中端安卓手机(骁龙665)上实现每秒15帧以上的实时检测,同时…...

Unity角色移动手感优化:从WASD输入到物理移动的完整链路

1. 这不是“写个Input.GetAxis”就能跑通的移动逻辑在Unity项目里,只要角色需要被玩家操控,WASDQEShift这套组合键几乎就是默认配置——它不依赖鼠标、不强制视角绑定、兼容手柄映射,是PC端第三人称/第一人称角色最基础也最易被低估的交互层。…...

Midjourney V6皮肤渲染实战手册:从油腻/塑料/失真到真实毛孔级质感的5步黄金流程

更多请点击: https://intelliparadigm.com 第一章:Midjourney V6皮肤渲染的核心挑战与认知跃迁 Midjourney V6 在图像生成能力上实现了质的飞跃,尤其在材质表现维度——皮肤渲染——呈现出前所未有的真实感与层次感。然而,这种进…...

JWT密钥轮换静默失效的热修复实战指南

1. 这不是漏洞公告,而是一份热修复作战手册Seedance2.0 v2.0.3上线刚满72小时,我们团队在灰度环境做JWT签名校验一致性压测时,发现一个反直觉现象:新签发的token在旧服务节点上能通过验签,但旧token在新节点上却频繁失…...

JWT密钥轮换缺陷与零停机热修复实战指南

1. 这不是一次普通升级,而是一次密钥信任体系的临界点崩塌Seedance2.0 v2.0.3发布不到72小时,我在给客户做例行安全巡检时,发现一个反直觉的现象:所有新签发的JWT令牌在旧版本客户端(v2.0.2)上验证失败&…...

Malware-Traffic-Analysis.net:真实恶意流量分析实战指南

1. 这不是另一个“抓包教程网站”,而是一套真实攻防现场的流量解剖实验室Malware-Traffic-Analysis.net——这个名字乍看平平无奇,像极了某篇技术博客末尾随手贴出的参考资料链接。但如果你真点进去,翻过首页那几行朴素的英文介绍&#xff0c…...

Wireshark深度解析:HTTP/1.1协议层隐写与pcapng元数据取证

1. 这不是一次普通的数据包分析,而是一场“协议层藏宝游戏”Wireshark实战:解密http1.pcapng中的隐藏flag——光看标题,你可能以为这只是又一篇教你怎么点开Filter框、输http然后截图的入门教程。但实际操作中,我连续三次在http1.…...

Unity AI部署核心指南:Barracuda零拷贝推理实战

1. Barracuda不是“另一个推理引擎”,而是Unity原生ML部署的唯一合理解在Unity项目里跑一个训练好的PyTorch模型,你第一反应是不是导出ONNX、写个C# wrapper、再手动管理Tensor内存?我试过——两周时间卡在GPU张量生命周期上,最终…...

Unity节点化效率工具:ComfyUI范式赋能中大型项目开发

1. 这不是又一个“UI美化插件”,而是Unity开发者每天要敲十次的底层效率杠杆Efficiency Nodes ComfyUI——光看名字,很多人第一反应是“ComfyUI?那不是Stable Diffusion的可视化工作流工具吗?怎么跑Unity里来了?”这恰…...

工控机,怎么突然成了制造业里的“硬通货”?

工控机,怎么突然成了制造业里的“硬通货”? http:/www.lionconit.com 苏州联控信息科技有限公司原创 转载请备注来源 去年底,和一个做机器视觉设备的朋友聊天。 他说现在客户开会,讨论顺序已经变了。 以前大家最关心的是…...

为什么你的“cashmere sweater”总像塑料?Midjourney布料质感模拟的4个致命认知误区(附NASA纺织材料数据库对照表)

更多请点击: https://kaifayun.com 第一章:为什么你的“cashmere sweater”总像塑料?——Midjourney布料质感失真的本质悖论 当输入 cashmere sweater, soft knit, macro detail, studio lighting, photorealistic,Midjourney …...

中科院空天院团队Geography and Sustainability:1985年至2022年各国人均耕地面积差距的扩大:对实现可持续发展目标的威胁

耕地作为粮食的载体,是保障粮食安全的关键要素。全球人口增长不可避免地导致耕地扩张以满足对食物、纤维和能源日益增长的需求,这给耕地的承载能力带来沉重负担,并加速了土壤退化与流失,对实现联合国可持续发展目标2(S…...

2026免费在线去水印软件怎么选?实测5款推荐+功能对比指南

为什么需要去水印工具? 在内容创作和日常使用中,水印是版权保护的重要标志,但有时我们需要处理自己拥有版权的内容或进行合法的编辑操作。无论是整理自己的工作素材、编辑设计稿,还是去除合法获取内容上的平台标记,都需…...

Unity TMP InputField光标稳定方案:字体、渲染与输入法深度适配

1. 为什么InputField光标会“消失”、错位、卡死——不是Bug,是渲染管线的底层博弈 你有没有在Unity项目里遇到过这样的场景:UI界面一切正常,唯独InputField的光标不显示;或者光标明明在文字末尾,点击却跳到中间&#…...

2026最新免费在线去水印软件推荐:性能对比与选择指南

在2026年,处理视频和图片水印已经成为内容创作者和日常用户的常见需求。无论是社交媒体截图、下载的素材,还是自己录制的视频,水印往往会影响最终的呈现效果。那么,免费在线去水印软件哪个好?不同工具间的优缺点对比如…...