鸿蒙:使用worker实现多线程通信

前言:

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

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/worker-introduction#worker%E8%BF%90%E4%BD%9C%E6%9C%BA%E5%88%B6https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/worker-introduction#worker%E8%BF%90%E4%BD%9C%E6%9C%BA%E5%88%B6看了文档,我们就来练一练,本人的练习效果图和代码如下:

代码如下:

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);
}

以上是个人经验分享。

相关推荐
2601_9494800615 小时前
开源鸿蒙平台 KMP 三方库「AutoLinkText」适配全流程
华为·开源·harmonyos
JoyCong199815 小时前
ToDesk鸿蒙PC端又焕新!远控更稳、操作更准,跨端办公如本地
运维·华为·智能手机·harmonyos·远程工作
大雷神15 小时前
HarmonyOS7应用《拼棋派对》实战:深浅主题、控件对比度与统一样式
harmonyos·arkui·harmonyos 7.0·玩转 arkts
OH_TPC15 小时前
HarmonyOS APP开发---"动效君"UI动效素材库App,需要用到这个库
harmonyos
行者-全栈开发16 小时前
【鸿蒙心迹】三方库移植(一)——NAPI 把 C/C++ 库桥接到 ArkTS 的完整链路(HarmonyOS 7.x)
harmonyos·arkts·交叉编译·c/c++·napi·三方库移植
2601_9494800616 小时前
开源鸿蒙平台 CMP 三方库「reveal」适配全流程
华为·开源·harmonyos
2401_zq136y0316 小时前
开源鸿蒙平台 CMP 三方库「KToast」适配全流程
华为·开源·harmonyos
AI2中文网16 小时前
App Inventor 2 构建纯血鸿蒙 HarmonyOS NEXT App:证书、签名、真机安装到上架全流程
华为·harmonyos
贾伟康16 小时前
【共创稿事节】@State与@Prop的单向流
harmonyos·arkts·状态管理·state·prop
大雷神16 小时前
HarmonyOS7应用《拼棋派对》实战:模拟器回归验证与签名打包
harmonyos·arkui·harmonyos 7.0·玩转 arkts