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

认识Emitter:进程内的事件处理专家

在鸿蒙应用开发中,线程间通信是一个无法绕开的话题。今天,我们就来深入探讨一下鸿蒙NEXT中一个非常实用的工具——Emitter,看看它如何让线程间的数据传递变得轻松高效。

🔍 认识Emitter:进程内的事件处理专家

Emitter是鸿蒙NEXT中一种作用于进程内的事件处理机制,为应用程序提供了订阅事件、发布事件和取消事件订阅的能力。它基于经典的发布-订阅模式,让同一进程内的不同线程能够进行异步通信。

核心特性:

  • 进程内通信:仅限同一进程内的线程间通信

  • 异步执行:事件发布后立即返回,不会阻塞发布者线程

  • 多订阅者支持:一个事件可以被多个订阅者接收处理

  • 灵活订阅:支持持续订阅和单次订阅两种模式

🛠️ Emitter核心接口解析

掌握Emitter的关键在于理解其四个核心接口:

接口方法功能描述使用场景
on持续订阅事件,直至主动取消需要长期监听事件的场景
once单次订阅事件,执行后自动取消只需处理一次的事件
emit发布事件一次触发事件并传递数据
off取消订阅事件清理资源,防止内存泄漏

💻 实战演示:完整代码示例

下面通过一个完整的示例来展示Emitter的实际用法:

typescript

import { emitter } from '@kit.BasicServicesKit';
import { Callback } from '@kit.BasicServicesKit';@Entry
@Component
struct EmitterDemoPage {@State onResult: string = '持续订阅结果:';@State onceResult: string = '单次订阅结果:';@State emitResult: string = '事件发布结果:';@State count: number = 0;build() {Column({ space: 10 }) {Text('Emitter通信演示').fontSize(20).fontWeight(FontWeight.Bold)Text(`事件计数:${this.count}`).fontSize(16).margin(10)// 持续订阅事件Button('持续订阅事件').onClick(() => {let event: emitter.InnerEvent = { eventId: 1 };let callback: Callback<emitter.EventData> = (eventData: emitter.EventData) => {console.info(`收到事件数据:${JSON.stringify(eventData)}`);this.onResult = `持续订阅结果:${JSON.stringify(eventData)}`;};emitter.on(event, callback);})Text(this.onResult).fontSize(14).margin(5)// 单次订阅事件Button('单次订阅事件').onClick(() => {let event: emitter.InnerEvent = { eventId: 1 };let callback: Callback<emitter.EventData> = (eventData: emitter.EventData) => {console.info(`单次事件数据:${JSON.stringify(eventData)}`);this.onceResult = `单次订阅结果:${JSON.stringify(eventData)}`;};emitter.once(event, callback);})Text(this.onceResult).fontSize(14).margin(5)// 发布事件Button('发布事件').onClick(() => {this.count = this.count + 1;let event: emitter.InnerEvent = {eventId: 1,priority: emitter.EventPriority.LOW  // 设置事件优先级};let eventData: emitter.EventData = {data: {content: 'Emitter演示',count: this.count,timestamp: new Date().getTime()}};emitter.emit(event, eventData);this.emitResult = `已发布事件,计数:${this.count}`;})Text(this.emitResult).fontSize(14).margin(5)// 取消订阅Button('取消订阅').onClick(() => {emitter.off(1);console.info('已取消事件ID为1的所有订阅');})}.width('100%').height('100%').padding(20)}
}

📚 Emitter进阶用法

1. 事件优先级控制

在发布事件时,可以指定事件的优先级:

typescript

let highPriorityEvent: emitter.InnerEvent = {eventId: 2,priority: emitter.EventPriority.HIGH  // 高优先级
};let normalEvent: emitter.InnerEvent = {eventId: 3, priority: emitter.EventPriority.LOW   // 低优先级
};

2. 字符串事件标识

除了数字事件ID,Emitter还支持字符串标识:

typescript

// 使用字符串作为事件ID
emitter.on("DATA_LOADED", (eventData: emitter.EventData) => {console.info(`数据加载完成:${JSON.stringify(eventData)}`);
});// 发布字符串标识的事件
emitter.emit("DATA_LOADED", { data: { result: "success" } });

3. 与Worker线程配合

Emitter特别适合与Worker线程配合使用,实现主线程与工作线程的通信:

typescript

// 在主线程中
import worker from '@ohos.worker';let myWorker = new worker.ThreadWorker("workers/worker.js");// 订阅来自Worker的事件
emitter.on({ eventId: 1001 }, (eventData: emitter.EventData) => {// 处理Worker线程发送的数据console.info(`来自Worker的数据:${JSON.stringify(eventData)}`);
});// 在Worker线程中(worker.js)
// 处理完任务后发布事件
emitter.emit({ eventId: 1001 }, { data: processedData });

⚠️ 最佳实践与注意事项

  1. 及时取消订阅

    typescript

    // 组件销毁时取消订阅
    aboutToAppear() {this.subscribeEvents();
    }aboutToDisappear() {// 取消所有订阅emitter.off(1);emitter.off(2);
    }
  2. 避免内存泄漏

    • 确保onoff成对使用

    • 避免在回调函数中持有外部对象的引用

  3. 错误处理

    typescript

    try {emitter.emit({ eventId: 1 }, { data: importantData });
    } catch (error) {console.error(`事件发布失败:${error.message}`);
    }

🔄 技术选型:何时选择Emitter

在鸿蒙NEXT中,根据通信范围选择合适的技术很重要:

  • 同线程内UI组件通信 → 使用EventHub

  • 同一进程内跨线程通信 → 使用Emitter

  • 跨进程/应用通信 → 使用commonEventManager

💎 总结

Emitter作为鸿蒙NEXT中进程内线程通信的利器,以其简洁的API和高效的执行机制,为我们提供了优雅的线程间通信解决方案。通过本文的讲解和示例,相信你已经掌握了Emitter的核心用法。

记住Emitter的适用场景——同一进程内的线程间通信,在这个范围内,它可以帮你构建出解耦、高效的应用架构。

希望这篇博客能帮助你在鸿蒙开发中更加得心应手!如果你有任何问题或心得,欢迎在评论区分享交流。

http://www.dtcms.com/a/462802.html

相关文章:

  • RDK X5 镜像备份(详细)
  • 郑州建网站企业seo核心技术排名
  • 动易网站地图五款wordpress常用加速插件
  • 网站建设和运行费用中国国家城乡建设部网站
  • 5G与6G:从“万物互联“到“智能无界“的跨越
  • ISAC 4D Imaging System Based on 5G Downlink Millimeter Wave Signal
  • 建设银行网站点不进去了怎么办青岛网站有限公司
  • 开源模型应用落地-FireRedTTS2-从文本到声音的智能跃迁-“声”临其境(三)
  • 广州住房和城乡建设厅网站渭南网站建设公司定制网站建设公司
  • day03_八大基本数类型+程序交互+基本运算符+流程控制语句
  • android13 wifi热点setting学习笔记
  • 淘客网站cms怎么做建设部网站79号文件
  • 人工智能时代下的全栈开发:整合AI、大数据与云原生的实践策略
  • 家具品牌网站新东方培训机构官网
  • 速通ACM省铜第二十天 赋源码(HNCPC2022 Big Matrix 和 Fibonacci Cane)
  • 做预算查价格的网站是哪个中国空间网站
  • 网站地图生成工具微信营销策略
  • 什么是 Apache Parquet?ClickHouse 与 Parquet 的交互方式/安装 clickhouse-client
  • 批量做网站国内做seo最好的公司
  • 美丽说网站建立的主要方式2017设计工作室做网站
  • Centos7 maven 安装
  • 深入了解linux网络—— 自定义协议(上)
  • 大连网站制作最好的公司建设企业网站得花多少
  • 服装公司网站源码给网站做seo的价格
  • 购买型网站建设青岛网站建设公司好找吗
  • 在网站建设中遇到的问题手工制作国庆节作品图片
  • 了游*薄俐仔斗哆消仔*游戏程序系统方案
  • jsp网站加载慢开发一款app的公司
  • 如何建设网站pdf下载个人网页制作成品代码免费
  • 邢台网站建设多少钱WordPress考试