#鸿蒙通关秘籍#如何在HarmonyOS NEXT中使用Worker子线程解压文件?

HarmonyOS
6天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hm673ff0fbd0c6a

在HarmonyOS NEXT中,通过Worker子线程执行解压操作可以避免阻塞主线程。首先,在/src/main/ets/workers目录下创建Worker.ets文件,绑定Worker Port,然后在build-profile.json5中配置Worker文件路径,使其能够被打包。

在主线程中,通过new worker.ThreadWorker()创建Worker实例,并使用postMessage()向Worker线程发送沙箱路径和压缩文件名称。在Worker线程中,通过onmessage()方法接收这些数据。

接下来,使用fs.access判断输出目录是否存在,如果不存在,使用fs.mkdirSync()创建目录。然后调用zlib.decompressFile接口进行解压操作。最后,通过Worker Port将解压路径返回主线程。

完整代码参考:

// 创建Worker实例
let workerInstance = new worker.ThreadWorker('@decompressFile/ets/workers/Worker.ets');

// 向Worker线程发送消息
workerInstance.postMessage({ pathDir: this.pathDir, rawfileZipName: rawfileZipName });

// 在Worker.ets中接收消息
workerPort.onmessage = (e) => {
  let pathDir = e.data.pathDir;
  let rawfileZipName = e.data.rawfileZipName;

  fs.access(outFileDir).then((res) => {
    if (!res) {
      fs.mkdirSync(outFileDir);
    }
    zlib.decompressFile(`${pathDir}/${rawfileZipName}`, outFileDir, (errData) => {
      if (errData) {
        logger.error(`${errData.code}, ${errData.message}`);
      } else {
        workerPort.postMessage(outFileDir);
      }
    });
  }).catch((err) => {
    logger.error(`${err.message}, ${err.code}`);
  });
};
分享
微博
QQ
微信
回复
6天前
相关问题
如何在Worker中开启多级线程
318浏览 • 1回复 待解决