Worker线程的使用
1.概念
创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。
2.作用
Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。
3.创建Woker线程
export interface MessageDownload {work: stringContext?: Context
}// 1.监听worker线程的消息
workerPort.onmessage = (e: MessageEvents) => {//2.定义要执行的任务 : 下载文件const data = e.data as MessageDownloadif (data.work === 'start') {downloadFile(data.Context as Context)}
}// 下载文件
async function downloadFile(Context: Context) {const task = await request.downloadFile(Context, {url: 'https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_package_901_9/c1/v3/Jnel8gI8R1WszYSI3QKjLw/devecostudio-windows-5.0.3.900.zip?HW-CC-KV=V1&HW-CC-Date=20241019T022307Z&HW-CC-Expire=7200&HW-CC-Sign=E61763FE291FC1859C36F71D0396384908FF1F88A8AF4CB8DA7F47AE01236F58',filePath: Context.cacheDir + '/test.zip'})task.on('progress', (current, total) => {const progress = (current / total * 100).toFixed(2) + '%'// 4.通知页面:消息的内容必须是可序列化对象workerPort.postMessage({progress})if (current === total) {workerPort.close()}})
}
4.新建页面,创建Worker任务
import { worker } from '@kit.ArkTS'
import { MessageDownload } from '../../workers/Worker'@Entry
@Component
struct WorkerCase {@Stateprogress: string = '0%'myWorker?: worker.ThreadWorkercreateWorker() {// 1.创建worker任务//路径规范:模块名/worker文件夹/Worker文件名.etsconst myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets')this.myWorker = myWorker//3.页面通知worker开始下载myWorker.postMessage({work: 'start',Context: getContext()})//5.页面接收worker进度信息myWorker.onmessage = (e) => {this.progress = e.data.progress as string}}testWorker() {try {this.myWorker?.postMessage({work: 'test'} as MessageDownload)} catch (e) {console.error(e)}}build() {Column({ space: 10 }) {Text('下载速度:' + this.progress)Button('下载DevEco Studio').onClick(() => {this.createWorker()})Button('关闭Worker线程').onClick(() => {this.testWorker()})}.height('100%').width('100%').padding(50)}
}