纯血鸿蒙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.鸿蒙南向开发方向

相关推荐
一个小猴子`2 小时前
FFMpeg视频编码实战和音频编码实战
ffmpeg·音视频
EasyDSS4 小时前
国标GB28181视频平台EasyCVR如何搭建汽车修理厂远程视频网络监控方案
网络·音视频
心之所想,行之将至6 小时前
零基础开始学习鸿蒙开发-智能家居APP离线版介绍
学习·智能家居·harmonyos
无证驾驶梁嗖嗖7 小时前
FFMPEG大文件视频分割传输教程,微信不支持1G文件以上
音视频
__Benco8 小时前
OpenHarmony子系统开发 - 热管理(四)
人工智能·harmonyos
一个小猴子`8 小时前
FFMpeg音视频解码实战
ffmpeg·音视频
小白教程9 小时前
Python爬取视频的架构方案,Python视频爬取入门教程
python·架构·音视频·python爬虫·python视频爬虫·python爬取视频教程
小脑斧爱吃鱼鱼9 小时前
鸿蒙项目笔记(2)
笔记·学习·华为·harmonyos
Json____10 小时前
springboot 处理编码的格式为opus的音频数据解决方案【java8】
spring boot·后端·音视频·pcm·音频处理·解码器·opus
赤鸢QAQ11 小时前
ffpyplayer+Qt,制作一个视频播放器
python·qt·音视频