首页 > 其他分享 >HarmonyOS 实战开发-Worker子线程中解压文件

HarmonyOS 实战开发-Worker子线程中解压文件

时间:2024-04-24 15:36:03浏览次数:26  
标签:解压 文件 decompressFile ets Worker HarmonyOS 线程

介绍

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

效果图预览

image

使用说明

  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滑出可视区域外时销毁以降低内存占用。
  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线程

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing

    标签:解压,文件,decompressFile,ets,Worker,HarmonyOS,线程
    From: https://www.cnblogs.com/HarmonyOSNext/p/18155556

相关文章

  • c# 多线程控制最大线程数
    假定现在存在一个对象数组,需要对数组中的每个对象进行分析,但是分析存在较长的耗时处理,那么单线程处理就显得很局限了,这里就采用多线程处理,但是多线程要控制最大线程数量。线程与线程之间有会争取CPU资源,这就会导致上下文切换,上下文切换过多,必然增加线程的执行时间,影响了整体执......
  • HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置
    介绍本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。效果图预览使用说明:拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子组件,到目标List子组件位置,进行两者位置互换。实现思路在Grid组件中,通过editMode()打......
  • java线程池
    java线程池 一、线程池的7个核心参数 1.corePoolSize 核心线程数 corePoolSize是线程池中保持活动状态的最小线程数。即使线程是空闲的,它们也会一直保持在池中。当有新任务提交时,线程池会优先创建核心线程来处理任务。 2.maximumPoolSize 最大线程数 maximu......
  • 鸿蒙HarmonyOS实战-ArkUI动画(放大缩小视图)
    ......
  • HarmonyOS NEXT应用开发实战—组件堆叠
    介绍本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。效果图预览使用说明加载完成......
  • 解决多线程竞争条件——临界区
    如图所示,黑色表示没有获得CPU,绿色表示获得CPU,假设为单核两线程程情况。线程1开始运行,并进入临界区,在出临界区运行过程中到了上下文切换时间。线程2获得CPU,正常运行一段时间后需要运行至临界区代码,此时,线程1位于临界区。因为不能两个线程同时位于临界区,所以线程2阻塞。线程1获......
  • HarmonyOS NEXT应用开发—城市选择案例
    介绍本示例介绍城市选择场景的使用:通过AlphabetIndexer实现首字母快速定位城市的索引条导航。效果图预览使用说明分两个功能在搜索框中可以根据城市拼音模糊搜索出相近的城市,例如输入"a",会出现"阿尔山"、"阿勒泰地区"、"安庆"、"安阳"。下方城市列表通过AlphabetIndexer组......
  • HarmonyOS NEXT应用开发—听歌识曲水波纹特效案例
    介绍在很多应用中,会出现点击按钮出现水波纹的特效。效果图预览使用说明进入页面,点击按钮,触发水波纹动画。再次点击按钮,停止水波纹动画。实现思路本例涉及的关键特性和实现方案如下:要实现存在两个连续的涟漪,需要两个层叠的Stack分别以一定延迟进行相同的动画。源码参考......
  • Redis--单线程
    redis是单线程的吗?不是,redis的单线程指的是命令的执行是单线程的,如接收客户端请求->解析请求->进行数据读写等操作->发送数据给客户端这个过程是由一个线程(主线程)完成的。而redis程序并不是单线程,redis在启动的时候,会启动后台线程(BIO):Redis在2.6版本,会启动2个后台线程,分......
  • HarmonyOS NEXT应用开发案例—状态栏显隐变化
    介绍本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。效果预览图使用说明加载完成后显示状态栏显隐变化页面,上下拖动屏幕,顶端状态栏出现显隐变化。实现思路在置顶位置使用stack组件添加两层状态栏。源......