1.概念
创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。
2.作用
Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。
3.创建Woker线程
export interface MessageDownload {
work: string
Context?: Context
}
// 1.监听worker线程的消息
workerPort.onmessage = (e: MessageEvents) => {
//2.定义要执行的任务 : 下载文件
const data = e.data as MessageDownload
if (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 {
@State
progress: string = '0%'
myWorker?: worker.ThreadWorker
createWorker() {
// 1.创建worker任务
//路径规范:模块名/worker文件夹/Worker文件名.ets
const 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)
}
}