《解压Zip文件》二、启动一个Worker指南
HarmonyOS ohos.worker (启动一个Worker) 使用指南多线程实战详解模块类型系统内置模块关键词Worker、多线程、后台任务、线程通信、ArkTS效果一、为什么需要 Worker在 HarmonyOS 应用中主线程UI 线程负责界面渲染和用户交互。当执行耗时操作如大文件解压、复杂计算、数据解析时主线程会被阻塞导致界面卡顿甚至 ANR应用无响应。ohos.worker模块提供了多线程能力允许开发者将耗时任务放到独立的 Worker 线程中执行主线程保持流畅。工作原理图┌─────────────────┐ postMessage() ┌─────────────────┐ │ │ ─────────────────────► │ │ │ 主线程 (UI) │ │ Worker 线程 │ │ │ ◄───────────────────── │ (后台执行) │ └─────────────────┘ onmessage └─────────────────┘ │ 负责UI 渲染 │ 负责耗时任务 │ 用户交互 │ 文件操作 │ 事件处理 │ 数据计算线程通信模型Worker 线程与主线程之间通过消息机制进行通信主线程通过postMessage()向 Worker 发送数据Worker 线程通过workerPort.postMessage()向主线程返回结果双方通过onmessage回调接收对方的消息二、核心 API 一览2.1 主线程侧 APIimportworker,{MessageEvents}fromohos.worker;方法/属性说明new worker.ThreadWorker(scriptPath)创建 Worker 线程实例worker.postMessage(data)向 Worker 线程发送消息worker.onmessage接收 Worker 线程返回的消息worker.onmessageerror接收反序列化失败的消息worker.onerror接收 Worker 线程异常事件worker.terminate()销毁 Worker 线程释放资源2.2 Worker 线程侧 APIimport{MessageEvents,ErrorEvent,ThreadWorkerGlobalScope,worker}fromkit.ArkTS;方法/属性说明worker.workerPort获取 Worker 线程的全局作用域workerPort.postMessage(data)向主线程发送消息workerPort.onmessage接收主线程发来的消息workerPort.onmessageerror接收反序列化失败的消息workerPort.onerror接收 Worker 运行异常workerPort.close()关闭 Worker 线程线程内部调用三、完整实战示例3.1 场景后台执行文件解压本示例演示一个完整的 Worker 使用流程主线程发起解压请求Worker 在后台执行解压完成后通知主线程。3.2 步骤一配置 Worker 入口在entry/build-profile.json5中声明 Worker 文件路径{ apiType: stageMode, buildOption: { sourceOption: { workers: [ ./src/main/ets/workers/UnzipWorker.ets ] } } }重要必须在build-profile.json5中注册 Worker 文件否则编译时不会打包该文件运行时会报错找不到脚本。3.3 步骤二编写 Worker 线程代码文件路径entry/src/main/ets/workers/UnzipWorker.etsimport{ErrorEvent,MessageEvents,ThreadWorkerGlobalScope,worker}fromkit.ArkTS;importzlibfromohos.zlib;import{BusinessError}fromohos.base;import{hilog}fromkit.PerformanceAnalysisKit;constTAGUnzipWorker;// ✅ 定义消息协议接口避免 any 类型错误interfaceWorkerRequest{zipPath:string;extractPath:string;taskId:number;}// 获取 Worker 线程的全局通信端口constworkerPort:ThreadWorkerGlobalScopeworker.workerPort;// 监听主线程发来的消息workerPort.onmessage(e:MessageEvents){// ✅ 必须显式类型转换ArkTS 禁止使用隐式 anyconstdata:WorkerRequeste.dataasWorkerRequest;constzipPath:stringdata.zipPath;constextractPath:stringdata.extractPath;consttaskId:numberdata.taskId;hilog.info(0x0001,TAG,收到解压任务:${zipPath});constoptions:zlib.Options{level:zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION};try{zlib.decompressFile(zipPath,extractPath,options,(err:BusinessError){if(err!nullerr.code!0){// 解压失败通知主线程workerPort.postMessage({taskId:taskId,status:error,message:解压失败:${err.message}});}else{// 解压成功通知主线程workerPort.postMessage({taskId:taskId,status:success,message:解压完成});}});}catch(err){constbizErrerrasBusinessError;workerPort.postMessage({taskId:taskId,status:error,message:异常:${bizErr.message}});}};// 监听消息反序列化错误workerPort.onmessageerror(e:MessageEvents){hilog.error(0x0001,TAG,消息反序列化失败);};// 监听 Worker 运行异常workerPort.onerror(e:ErrorEvent){hilog.error(0x0001,TAG,Worker 异常:${e.message});};3.4 步骤三在主线程中使用 Workerimportworker,{MessageEvents}fromohos.worker;import{PromptAction}fromkit.ArkUI;import{Context}fromkit.AbilityKit;interfaceUnzipResult{taskId:number;status:success|error;message:string;}functionstartUnzipInWorker(context:Context,zipPath:string,extractPath:string,promptAction:PromptAction):void{// 1. 创建 Worker 实例路径相对于 entry/src/main/ets/constunzipWorkernewworker.ThreadWorker(entry/ets/workers/UnzipWorker.ets);// 2. 监听 Worker 返回的消息unzipWorker.onmessage(e:MessageEvents):void{constresulte.dataasUnzipResult;if(result.statussuccess){promptAction.showToast({message:result.message});}else{promptAction.showToast({message:result.message});}// 3. 使用完毕后销毁 Worker释放资源unzipWorker.terminate();};// 3. 监听 Worker 异常unzipWorker.onerror(e:ErrorEvent):void{promptAction.showToast({message:Worker 错误:${e.message}});unzipWorker.terminate();};// 4. 向 Worker 发送解压任务unzipWorker.postMessage({zipPath:zipPath,extractPath:extractPath,taskId:Date.now()});}四、消息传递的数据类型Worker 线程与主线程之间传递的数据通过结构化克隆算法进行序列化支持以下类型支持的类型示例基本类型string、number、boolean、null、undefined对象与数组{ name: test }、[1, 2, 3]ArrayBuffer二进制数据传输Map / Set集合类型Date / RegExp内置对象不支持的类型会抛出序列化异常函数FunctionDOM 节点SymbolWeakMap / WeakSet包含循环引用的对象五、Worker 生命周期管理5.1 创建阶段constmyWorkernewworker.ThreadWorker(entry/ets/workers/MyWorker.ets);创建时传入的路径格式为{moduleName}/ets/workers/{fileName}.ets5.2 运行阶段// 发送消息myWorker.postMessage({action:start,payload:data});// 接收消息myWorker.onmessage(e:MessageEvents){/* 处理结果 */};5.3 销毁阶段// 主线程销毁 WorkermyWorker.terminate();// Worker 线程自行关闭在 Worker 内部调用workerPort.close();最佳实践Worker 使用完毕后务必调用terminate()销毁否则线程会持续占用系统资源。六、最佳实践6.1 何时使用 Worker适合使用 Worker不适合使用 Worker文件压缩/解压简单的数据赋值大文件读写UI 状态更新图片处理/编码路由导航复杂数据计算快速同步操作JSON 大文件解析事件监听注册6.2 错误处理规范// ✅ 推荐完整的错误处理链myWorker.onmessage(e:MessageEvents){constresulte.dataasTaskResult;if(result.statuserror){// 处理业务错误}myWorker.terminate();// 确保销毁};myWorker.onerror(e:ErrorEvent){// 处理线程异常myWorker.terminate();};6.3 多 Worker 管理如果需要同时处理多个任务可以创建多个 Worker 实例// 并行解压多个文件for(constzipFileofzipFiles){constwnewworker.ThreadWorker(entry/ets/workers/UnzipWorker.ets);w.onmessage(e:MessageEvents){// 处理各自的结果w.terminate();};w.postMessage({zipPath:zipFile.path,extractPath:zipFile.out});}七、常见问题Q1Worker 文件找不到确保已在build-profile.json5的sourceOption.workers中注册路径。Q2postMessage 报错 “DataCloneError”检查传递的数据是否包含不支持的类型如函数、Symbol 等。Q3Worker 中能否访问 UI不能。Worker 线程无法操作 UI 组件只能通过消息将结果传回主线程由主线程更新 UI。Q4Worker 中能否使用 async/await可以。Worker 线程支持异步操作但需注意 Worker 的生命周期管理。Q5报错 “Use explicit types instead of any, unknown” (arkts-no-any-unknown)这是 ArkTS 的严格类型检查规则。MessageEvents的data属性返回类型为隐式any在 ArkTS 中必须显式声明类型// ❌ 错误隐式 anyworkerPort.onmessage(e:MessageEvents){constdatae.data;// 编译报错 arkts-no-any-unknownconstpathdata.zipPath;};// ✅ 正确定义接口 显式类型转换interfaceWorkerRequest{zipPath:string;extractPath:string;}workerPort.onmessage(e:MessageEvents){constdata:WorkerRequeste.dataasWorkerRequest;// 显式类型constpath:stringdata.zipPath;};经验提示主线程接收 Worker 消息时同样需要显式类型转换如const resp e.data as WorkerResponse;

相关新闻

200行代码硬核读取ext4磁盘文件

200行代码硬核读取ext4磁盘文件

我们可能听说过很多文件系统,比如 FAT32、NTFS、EXT4,在linux 下 EXT4 是一个使用比较广泛的文件系统,前面的小节我们简单介绍了 EXT4 文件系统的内部结构,这个小节我们用硬核方式读取 EXT4 文件系统下 /etc/hosts 文件&#xff0…

2026/7/23 0:20:34阅读更多 →
2026年最新英语写作批改平台挑选指南 附实用避坑技巧

2026年最新英语写作批改平台挑选指南 附实用避坑技巧

文章摘要:随着英语写作批改需求快速增长,市场上涌现了大量智能批改工具,但质量参差不齐,普通用户往往难以甄别。本文旨在帮助读者厘清核心评估维度,从技术能力、场景适配、合规安全等角度系统梳理挑选标准,…

2026/7/23 0:20:34阅读更多 →
2026 Cloudflare 5秒盾解决指南:无限验证码、403拦截与Bot检测优化方法

2026 Cloudflare 5秒盾解决指南:无限验证码、403拦截与Bot检测优化方法

在2026年的企业数字化运营中,公开数据采集、自动化测试、SEO监控已成为核心基础设施。然而,随着 Cloudflare 将其防护机制全面升级为以 Turnstile(无感验证) 和 AI 驱动的行为生物识别(Behavioral Biometrics&#xff…

2026/7/23 0:20:34阅读更多 →
MSPM0 I2C模块深度解析:从协议基础到多主模式与FIFO高效应用

MSPM0 I2C模块深度解析:从协议基础到多主模式与FIFO高效应用

1. I2C协议基础与MSPM0模块概览I2C,这个在嵌入式世界里几乎无处不在的两线串行总线,对于任何一位嵌入式开发者来说,都像是电路板上的“普通话”。它用最精简的连线——一根数据线(SDA)和一根时钟线(SCL&…

2026/7/24 1:46:26阅读更多 →
计算机毕业设计之基于SpringBoot的汽车充电桩管理系统的设计与实现

计算机毕业设计之基于SpringBoot的汽车充电桩管理系统的设计与实现

本论文借助 Java 编程语言,运用VUE 前端架构及SpringBoot 后端架构,以 MySQL 数据库为依托,对一套汽车充电桩管理系统进行了分析和设计。此系统包括汽车充电桩、预约充电、取消预约等功能,并划分为用户、维修工和管理员三个角色&a…

2026/7/24 1:46:26阅读更多 →
2026年中式台球:中台协、乔氏、独牙、康溪盛世、腾勃差异对比

2026年中式台球:中台协、乔氏、独牙、康溪盛世、腾勃差异对比

随着中式八球(Heyball)跻身国际赛事及商业化爆发,中式台球产业链迎来高速增长。本文针对台球俱乐部投资者及从业者,深度解析中国台球协会(CBSA)、乔氏、独牙、康溪盛世、腾勃五大核心主体的生态定位、硬件优…

2026/7/24 1:46:26阅读更多 →
微软 WSL 容器:让 Windows 无缝调用 Linux 代码,开启开发新体验!

微软 WSL 容器:让 Windows 无缝调用 Linux 代码,开启开发新体验!

能否在 Windows 应用中使用 Linux 代码?现在可以了如果你能在不修改代码的情况下,将 Linux 代码用于 Windows 应用程序中,会怎么样呢?现在,你可以做到了。Windows 运行容器难题待解在 Windows 上运行容器从来都不是一件…

2026/7/24 1:46:26阅读更多 →
分布式算力网络:AI训练成本优化与Fluidstack实践指南

分布式算力网络:AI训练成本优化与Fluidstack实践指南

如果你最近关注AI算力市场,可能会注意到一个现象:传统云服务商提供的GPU实例越来越难抢,价格却持续上涨。就在这种背景下,一家名为Fluidstack的公司宣布获得8.3亿美元融资,目标是部署百GW级别的算力基础设施。这不仅仅…

2026/7/24 1:46:26阅读更多 →
六层PCB为何成为中控设备主流标准架构

六层PCB为何成为中控设备主流标准架构

在工业自动化、楼宇自控、PLC、远程 IO、边缘网关等中控设备研发领域,PCB 层数选型长期存在两极选择:四层板追求低成本,但难以应对复杂信号、多路电源与严苛 EMC 环境;八层及以上多层板性能充足,却显著抬高裸板成本、拉…

2026/7/24 1:44:26阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

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

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

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

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

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

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

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

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