介紹
本示例介紹在 Worker 子線程使用 @ohos.zlib 提供的zlib.decompressfile接口對沙箱目錄中的壓縮文件進行解壓操作,解壓成功后將解壓路徑返回主線程,獲取解壓文件列表。
效果圖預覽
使用說明
- 點擊解壓按鈕,解壓test.zip文件,顯示解壓結果。
實現思路
- 在/src/main/ets/workers目錄下創建Worker.ets線程文件,綁定Worker對象。
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
- 在build-profile.json5中進行配置Worker線程文件路徑,Worker線程文件才能確保被打包到應用中。
"buildOption": {
"sourceOption": {
"workers": [
"./src/main/ets/workers/Worker.ets"
]
}
}
- 在主線程創建一個Worker線程,通過new worker.ThreadWorker()創建Worker實例,傳入Worker.ets的加載路徑。
let workerInstance: worker.ThreadWorker = new worker.ThreadWorker('@decompressFile/ets/workers/Worker.ets');
- 主線程使用postMessage()向worker線程發送應用沙箱路徑和壓縮文件名稱。
workerInstance.postMessage({ pathDir: this.pathDir, rawfileZipName: rawfileZipName });
- 在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后綴的壓縮文件名稱
}
- 使用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}`);
});
高性能知識點
- 本示例使用了LazyForEach進行數據懶加載,List布局時會根據可視區域按需創建ListItem組件,并在ListItem滑出可視區域外時銷毀以降低內存占用。
- 本示例使用在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??,不定期分享原創知識。
- 想要獲取更多完整鴻蒙最新學習知識點,請移步前往小編:
https://gitee.com/MNxiaona/733GH/blob/master/jianshu