纯血鸿蒙APP实战开发——Worker子线程中解压文件

介绍

本示例介绍在Worker
子线程使用@ohos.zlib
提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压成功后将解压路径返回主线程,获取解压文件列表。

效果图预览

使用说明

  1. 点击解压按钮,解压test.zip文件,显示解压结果。

实现思路

  1. 在/src/main/ets/workers目录下创建Worker.ets线程文件,绑定Worker对象。
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  1. 在build-profile.json5中进行配置Worker线程文件路径,Worker线程文件才能确保被打包到应用中。
"buildOption": {"sourceOption": {"workers": ["./src/main/ets/workers/Worker.ets"]}
}
  1. 在主线程创建一个Worker线程,通过new worker.ThreadWorker()创建Worker实例,传入Worker.ets的加载路径。
let workerInstance: worker.ThreadWorker = new worker.ThreadWorker('@decompressFile/ets/workers/Worker.ets');
  1. 主线程使用postMessage()向worker线程发送应用沙箱路径和压缩文件名称。
workerInstance.postMessage({ pathDir: this.pathDir, rawfileZipName: rawfileZipName });
  1. 在Worker.ets文件中通过调用onmessage()方法接收主线程发送的应用沙箱路径和压缩文件名称。
workerPort.onmessage = (e: MessageEvents): void => {logger.info(TAG, `Worker onmessage:${JSON.stringify(e.data)}`);let pathDir: string = e.data.pathDir; // 沙箱目录let rawfileZipName: string = e.data.rawfileZipName; // 带.zip后缀的压缩文件名称
}
  1. 使用fs.access判断输出目录是否已经存在,如果不存在使用fs.mkdirSync()创建空目录用于放置解压后的文件。空目录创建成功后使用zlib.decompressFile接口解压压缩文件,输出到空目录中。
fs.access(outFileDir).then((res: boolean) => {if (!res) {// TODO:知识点:使用fs.mkdirSync创建目录,用于存放解压后的文件。fs.mkdirSync(outFileDir);logger.info(TAG, 'mkdirSync succeed');}// TODO:知识点:使用zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压至指定沙箱目录outFileDir。// 如果待解压的文件或文件夹在解压后的路径下已经存在,则会直接覆盖同名文件或同名文件夹中的同名文件。zlib.decompressFile(`${pathDir}/${rawfileZipName}`, outFileDir, (errData: BusinessError) => {if (errData !== null) {logger.error(TAG, `decompressFile failed. code is ${errData.code}, message is ${errData.message}`);} else {logger.info(TAG, `decompressFile succeed. outFileDir is ${outFileDir}`);// TODO:知识点:Worker线程向主线程发送信息。workerPort.postMessage(outFileDir);}})
}).catch((err: BusinessError) => {logger.error(TAG, `access failed with error message: ${err.message}, error code: ${err.code}`);
});

高性能知识点

  1. 本示例使用了LazyForEach进行数据懒加载,List布局时会根据可视区域按需创建ListItem组件,并在ListItem滑出可视区域外时销毁以降低内存占用。参考文章正确使用LazyForEach优化
  2. 本示例使用在Work子线程中使用zlib.decompressFile解压文件,避免阻塞主线程的运行。参考文章多线程能力场景化示例实践。

工程结构&模块类型

   decompressFile                                // har类型|---/src/main/ets/model                        |   |---FileListDataSource.ets                // 数据模型层-列表数据模型 |   |---FileItemModel.ets                     // 数据模型层-列表项数据模型|---/src/main/ets/view                        |   |---MainPage.ets                          // 视图层-场景列表页面|---/src/main/ets/workers                        |   |---Worker.ets                            // Worker线程

模块依赖

  1. 本实例依赖common模块来获取日志工具类logger。

参考资料

@ohos.worker(启动一个Worker)

@ohos.zlib(Zip模块)

@ohos.file.fs(文件管理)

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707011.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nebula街机模拟器 Mac移植版(400+游戏roms)汉化版

nebula星云模拟器是电脑上最热门的街机游戏模拟器之一,玩家可以通过这个小巧的模拟器软件进行多款经典街机游戏启动和畅玩,本次移植的包含400多款游戏roms,经典的三国志、三国战纪、拳皇、街霸、合金弹头、1941都包含在内。 下载地址&#xf…

数字孪生之数据采集

一、数据采集的定义和作用 在数字孪生中,采集是指从现实世界中收集数据并将其传输到数字孪生系统中的过程。采集的目的是为了获取现实世界中的实时数据,以便在数字孪生系统中进行分析、模拟和预测。 采集的作用主要有以下几个方面: 数据同步…

一个强大的在线解析网站,无需登录,只用把视频链接粘贴进去就能免费解析下载视频。

TiQu.cc是什么? TiQu.cc是一个强大的在线工具,让用户可以从包括Facebook、VK、Twitter、Tiktok、Instagram等在内的100多个平台下载他们喜爱的视频。不论是音乐、电视节目、电影、短片还是个人上传的内容,TiQu.cc都可以帮助您随时随地以离线…

诸葛智能携手五大银行,以数据驱动的营销中台带来可预见增长

对于银行来说,客户是赖以生存的基础,也是保持活力的关键。尤其是大数据、人工智能等新兴技术的推动下,通过数据赋能产品升级和服务创新,深挖客户潜能,更是助推银行快步迈入高质量发展的新阶段。 在银行加速拥抱新质生…

抖音多直播间自动发送评论自动涨粉

抖音,这个名字我相信大家都不会陌生。作为一款流行的短视频和直播平台,抖音已经融入了我们的日常生活。我想今天和大家分享的就是如何在抖音上吸引更多的粉丝,特别是在直播间中。大家都知道,直播间的粉丝多了,可以带动…

GBDT调参--贝叶斯调参

随机抽特征和随机抽样本 n_estimators 是控制森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越 大,模型的效果往往越好。但是相应的,任何模型都有决策边 n_estimators达到一定的程…

操作系统磁盘管理类问题

例题:在磁盘上存储数据的排列方式会影响1/0服务的总时间。假设每个磁道被划分成10个物理块,每个物理块存放1个逻辑记录。逻辑记录R1,R2....R10存放在同一个磁道上,记录的排列顺序如下表所示: 假定磁盘的旋转速度为10ms/周&#xf…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第23课-烟花插件的售卖效果优化

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第23课-烟花插件的售卖效果优化 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智…

(3)双指针练习:快乐数

快乐数 题目链接:202. 快乐数 - 力扣(LeetCode) 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 1. 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 2. 然后重复这个过程直到这个数变…

系统架构师考试(二)

敏捷方法 CMMI代表Capability Maturity Model Integration,是一种用于评估和改进组织软件工程和系统工程的模型。CMMI提供一个框架,帮助组织评估其软件和系统工程的成熟度,该模型基于过程成熟度模型(CMM)和集成项目管理…

Ubuntu 24 换国内源及原理 (阿里源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources (阿里源) Types: deb deb-src URIs: https://mirrors.aliyun.com/ubunt…

鸿蒙HarmonyOS开发:@Builder装饰器,自定义构建函数

文章目录 一、自定义构建函数1、自定义组件内自定义构建函数2、全局自定义构建函数3、参数传递规则 二、示例演示1、Image组件2、layoutWeight属性3、定义模型类4、代码5、效果 一、自定义构建函数 ArkUI还提供了一种更轻量的UI元素复用机制Builder,Builder所装饰的…