前言:
我们还是老样子,跟着官方文档学习与实践,链接如下:


代码如下:
1、Index.ets
import { init, postMessage, onMessage } from '../workers/WorkerUtil';
@Entry
@Component
struct Index {
@State message: string = '使用worker发送消息';
build() {
Column({ space: 30 }) {
Text("使用worker触发弹窗")
.fontSize(30)
.fontWeight(FontWeight.Bold)
.onClick(() => {
init(this.getUIContext())
onMessage()
postMessage("展示弹窗")
})
Text(this.message)
.fontSize(30)
.fontWeight(FontWeight.Bold)
.onClick(() => {
onMessage()
postMessage(" 番茄")
postMessage(" 鼠标")
postMessage(" 键盘")
postMessage(" 数据线")
})
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
}
2、WorkUtil.ets
import { MessageEvents, worker } from "@kit.ArkTS";
// 创建Worker对象
let workerInstance = new worker.ThreadWorker('entry/ets/workers/worker.ets');
export let UIContextInstance: UIContext | undefined
export function init(uiContext: UIContext) {
// 获取UIContext对象
UIContextInstance = uiContext;
}
export function onMessage() {
// 注册onmessage回调,捕获宿主线程接收到来自其创建的Worker通过workerPort.postMessage接口发送的消息。该回调在宿主线程执行
workerInstance.onmessage = (e: MessageEvents) => {
let data: string = e.data;
console.info('workerInstance onmessage is: ', data);
if (UIContextInstance && data == "使用worker发送消息展示弹窗") {
UIContextInstance.showAlertDialog({ message: data })
}
}
}
export function postMessage(data: string) {
// 发送消息给Worker线程
workerInstance.postMessage(data);
}
3、worker.ets
// worker.ets
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
// 注册onmessage回调,当Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用,在Worker线程执行
workerPort.onmessage = (e: MessageEvents) => {
let data: string = e.data;
console.info('workerPort onmessage is: ', data);
// 向宿主线程发送消息
workerPort.postMessage('使用worker发送消息' + data);
}
// 注册onmessageerror回调,当Worker对象接收到一条无法被序列化的消息时被调用,在Worker线程执行
workerPort.onmessageerror = () => {
console.error('workerPort onmessageerror');
}
// 注册onerror回调,捕获Worker在执行过程中发生的异常,在Worker线程执行
workerPort.onerror = (err: ErrorEvent) => {
console.error('workerPort onerror err is: ', err.message);
}
以上是个人经验分享。