鸿蒙三方库 | harmony-utils之EmitterUtil线程间通信详解
前言线程间通信是并发编程的基础能力HarmonyOS提供了Emitter机制用于线程间事件传递。pura/harmony-utils的EmitterUtil封装了Emitter的订阅和发送方法简化了线程间通信的实现。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解帮助开发者快速掌握并应用到实际项目中。一、EmitterUtil核心APIEmitterUtil提供了以下线程间通信方法方法说明参数使用场景on(eventId, callback)订阅事件eventId, callback事件监听off(eventId, callback)取消订阅eventId, callback释放资源emit(eventId, data)发送事件eventId, data事件触发1.1 核心特性简洁易用封装复杂API为一行调用降低使用门槛类型安全完整的TypeScript类型定义编译期即可发现错误异常处理内置异常捕获机制避免运行时崩溃线程安全支持跨线程事件传递1.2 事件ID管理建议范围说明示例1000-1999用户交互事件点击、长按2000-2999数据更新事件数据刷新、同步3000-3999系统状态事件网络变化、电量变化二、完整使用步骤2.1 安装依赖ohpminstallpura/harmony-utils2.2 订阅事件import{EmitterUtil}frompura/harmony-utils;privateeventCallback(data){this.result收到事件:${JSON.stringify(data)};};aboutToAppear(){EmitterUtil.on(1001,this.eventCallback);}aboutToDisappear(){EmitterUtil.off(1001,this.eventCallback);}2.3 发送事件Button(发送事件).width(100%).onClick((){try{EmitterUtil.emit(1001,{message:Hello from Emitter!});this.result事件已发送 ;}catch(e){this.result异常: e;}})三、完整页面示例import{EmitterUtil}frompura/harmony-utils;EntryComponentstruct EmitterDemo{Stateresult:string;aboutToAppear(){EmitterUtil.on(1001,(data){this.result收到:${JSON.stringify(data)};});}aboutToDisappear(){EmitterUtil.off(1001);}build(){Column({space:12}){Button(发送事件).width(100%).onClick((){EmitterUtil.emit(1001,{msg:Hello});});Text(this.result).fontSize(14).fontColor(#333333)}.padding(16)}}四、进阶用法4.1 事件总线import{EmitterUtil}frompura/harmony-utils;classEventBus{staticreadonlyEVENTS{USER_LOGIN:1001,DATA_REFRESH:2001,NETWORK_CHANGE:3001};staticon(eventId:number,callback:Function):void{EmitterUtil.on(eventId,callback);}staticemit(eventId:number,data?:Object):void{EmitterUtil.emit(eventId,data);}staticoff(eventId:number,callback?:Function):void{EmitterUtil.off(eventId,callback);}}4.2 跨组件通信EmitterUtil.emit(2001,{action:refresh,target:userList});五、注意事项事件ID建议使用常量定义事件ID避免硬编码取消订阅页面销毁时务必取消订阅避免内存泄漏回调引用订阅和取消需使用同一回调引用初始化依赖使用前需确保AppUtil.init()已调用事件数据事件数据应尽量精简避免传递大对象六、常见问题Q1: 事件发送后回调不触发检查事件ID是否一致回调是否正确注册。Q2: 多次订阅同一事件会触发多次吗是的每个订阅的回调都会触发注意避免重复订阅。Q3: 可以跨Ability通信吗EmitterUtil支持同进程内的线程间通信跨进程需使用其他方案。Q4: 事件数据大小有限制吗建议事件数据不超过10KB大数据建议通过文件或数据库传递。总结EmitterUtil的线程间通信方法为组件间和线程间的事件传递提供了便捷支持。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。开发者可以利用事件总线模式实现松耦合的组件通信。本文基于pura/harmony-utils工具库更多功能请参考官方文档与后续系列文章。

相关新闻

2025年机器学习十大算法全景解析:从理论到实践的深度指南

2025年机器学习十大算法全景解析:从理论到实践的深度指南

在人工智能驱动的2025年,机器学习算法已成为科技革命的核心引擎。从自动驾驶的实时决策到医疗诊断的精准预测,从金融风控的智能分析到个性化推荐的千人千面,十大经典算法持续进化,构建起智能社会的数字基石。在人工智能驱动的2025…

2026/7/23 18:02:23 阅读更多 →
OpenWrt软路由空间扩容

OpenWrt软路由空间扩容

文章目录 预备知识 OpenWrt系统固件分类 EXT4固件扩容方式 新建分区扩容 操作步骤 直接扩容 操作步骤 SQUASHFS固件扩容方式 新建分区扩容 直接扩容 EFI引导固件的额外操作 参考 预备知识 OpenWrt系统固件分类 EXT4固件 固件包名称中包含有ext4关键字,可以参考固件分类关键字…

2026/7/23 18:02:23 阅读更多 →
关于在VM虚拟机下,安装OpenWrt软路由,所遇错误及解决方法。

关于在VM虚拟机下,安装OpenWrt软路由,所遇错误及解决方法。

首先是去阿里的openwrt源下载的镜像为img格式,vm虚拟无法识别,需要转换为iso格式或者vmdk格式,用软碟通转换iso格式失败,于是准备转换成vmdk格式,网上大部分采用starwindconverter软件,但是最新的版本老是报…

2026/7/23 18:02:23 阅读更多 →

最新新闻

Draw.io or diagrams.net 使用方法

Draw.io or diagrams.net 使用方法

0 Preface/Foreword 在工作中,经常需要用到框图,流程图,时序图,等等,draw.io可以完成以上工作。 official website:draw.io 1 Usage 1.1 VS code插件 draw.io可以扩展到VS code工具中。

2026/7/23 18:14:28 阅读更多 →
如何在OpenWRT软路由系统部署uhttpd搭建web服务器实现远程访问——“cpolar内网穿透”

如何在OpenWRT软路由系统部署uhttpd搭建web服务器实现远程访问——“cpolar内网穿透”

文章目录前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器,目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器,并且和 O…

2026/7/23 18:14:28 阅读更多 →
DefaultCPUAllocator: not enough memory: you tried to allocate 4200595456 bytes

DefaultCPUAllocator: not enough memory: you tried to allocate 4200595456 bytes

DefaultCPUAllocator: not enough memory: you tried to allocate 4200595456 bytes报错:DefaultCPUAllocator: not enough memory: you tried to allocate 4200595456 bytes程序加载到 text_encoder(文本编码器) 阶段,需要一次性…

2026/7/23 18:14:27 阅读更多 →
docker中终端用户名显示为淡蓝色

docker中终端用户名显示为淡蓝色

问题 一般情况下默认进入docker后,用户名和主机名都是白色的,看着不舒服,因此想将用户名和主机名改为自己定义的颜色 解决方法 修改~/.lbashrc,修改PS1的值即可.淡蓝色为: PS1${debian_chroot:($debian_chroot)}\[\033[01;36m\]\u…

2026/7/23 18:14:27 阅读更多 →
一篇文章彻底搞懂 MySQL 和 Redis:原理、区别、项目用法全解析(建议收藏)

一篇文章彻底搞懂 MySQL 和 Redis:原理、区别、项目用法全解析(建议收藏)

一篇文章彻底搞懂 MySQL 和 Redis:原理、区别、项目用法全解析(建议收藏) 在现代后端开发中,MySQL 和 Redis 是两种最常用的数据存储系统。很多开发者虽然会使用它们,但对底层原理和适用场景的理解往往比较模糊。本文将…

2026/7/23 18:14:27 阅读更多 →
Mini小主机All-in-one搭建教程2-安装Openwrt软路由系统

Mini小主机All-in-one搭建教程2-安装Openwrt软路由系统

Mini小主机All-in-one搭建教程2-安装Openwrt软路由系统 硬件介绍 在狗东买的 极摩客M2 到手价是2799元 具体配置如下: 酷睿英特尔11代标压ai7 11390H 64G1TB固态。 以下是安装Openwrt软路由系统的教程。 安装Openwrt软路由系统 下载镜像包 首先下载软路由的懒…

2026/7/23 18:13:27 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻