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

介绍

本示例介绍在Worker

子线程使用@ohos.zlib

提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压成功后将解压路径返回主线程,获取解压文件列表。

效果图预览

使用说明

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

实现思路

  1. 在/src/main/ets/workers目录下创建Worker.ets线程文件,绑定Worker对象。
ts 复制代码
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  1. 在build-profile.json5中进行配置Worker线程文件路径,Worker线程文件才能确保被打包到应用中。
json5 复制代码
"buildOption": {
  "sourceOption": {
    "workers": [
      "./src/main/ets/workers/Worker.ets"
    ]
  }
}
  1. 在主线程创建一个Worker线程,通过new worker.ThreadWorker()创建Worker实例,传入Worker.ets的加载路径。
ts 复制代码
let workerInstance: worker.ThreadWorker = new worker.ThreadWorker('@decompressFile/ets/workers/Worker.ets');
  1. 主线程使用postMessage()向worker线程发送应用沙箱路径和压缩文件名称。
ts 复制代码
workerInstance.postMessage({ pathDir: this.pathDir, rawfileZipName: rawfileZipName });
  1. 在Worker.ets文件中通过调用onmessage()方法接收主线程发送的应用沙箱路径和压缩文件名称。
ts 复制代码
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接口解压压缩文件,输出到空目录中。
ts 复制代码
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.鸿蒙南向开发方向

相关推荐
幽蓝计划23 分钟前
HarmonyOS NEXT仓颉开发语言实战案例:电影App
华为·harmonyos
阿蒙Amon39 分钟前
【Python小工具】使用 OpenCV 获取视频时长的详细指南
python·opencv·音视频
HMS Core2 小时前
HarmonyOS免密认证方案 助力应用登录安全升级
安全·华为·harmonyos
生如夏花℡2 小时前
HarmonyOS学习记录3
学习·ubuntu·harmonyos
伍哥的传说2 小时前
鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)
前端·华为·前端框架·harmonyos·鸿蒙
aqi003 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
正在走向自律5 小时前
第二章-AIGC入门-开启AIGC音频探索之旅:从入门到实践(6/36)
人工智能·aigc·音视频·语音识别·ai音乐·ai 音频·智能语音助手
美狐美颜sdk12 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
melonbo16 小时前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
遇到困难睡大觉哈哈16 小时前
HarmonyOS 公共事件机制介绍以及多进程之间的通信实现(9000字详解)
华为·harmonyos