鸿蒙 emitter使用

315 阅读1分钟

emitter是鸿蒙的发布订阅模块,可以跨线程使用,适合多线程开发,也可以用于上传文件是的数据实时更新的反馈

@ohos.events.emitter (Emitter)

本模块提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。

本文只展示最基础的使用,具体的实现大家可以去官方文档进行查看

官网连接:docs.openharmony.cn/pages/v4.1/…

订阅事件


export const emitOn = () =>{
  emitter.on('1',()=>{
    console.log('emit on')
  })
}

发布事件

export const emitEmit = () =>{
  emitter.emit('1')
}

在worker次线程中发布事件,主线程订阅事件则收到后执行相关函数

主线程订阅事件

async onPageShow(): Promise<void> {
  emitOn()
  this.workerTest()
  // emitEmit()
}

主线程worker代码

private workerTest(){
  const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets');
  let done = false;

  // 接收Worker子线程的结果
  workerInstance.onmessage = (() => {
    console.info('MyWorker.ts onmessage');
    if (!done) {
      workerInstance.postMessage({ 'type': 1, 'value': 0 });
      done = true;
    }
  })

  workerInstance.onerror = (() => {
    // 接收Worker子线程的错误信息
  })

  // 向Worker子线程发送训练消息
  workerInstance.postMessage({ 'type': 0 });
}

worker线程代码

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import { emitEmit } from '../common/emit';

const workerPort: ThreadWorkerGlobalScope = worker.workerPort;

/**
 * Defines the event handler to be called when the worker thread receives a message sent by the host thread.
 * The event handler is executed in the worker thread.
 *
 * @param e message data
 */
workerPort.onmessage = (e: MessageEvents) => {
  console.log(`e type:${JSON.stringify(e.data)}`)
  console.log('start worker...............')
  emitEmit()
}

/**
 * Defines the event handler to be called when the worker receives a message that cannot be deserialized.
 * The event handler is executed in the worker thread.
 *
 * @param e message data
 */
workerPort.onmessageerror = (e: MessageEvents) => {
}

/**
 * Defines the event handler to be called when an exception occurs during worker execution.
 * The event handler is executed in the worker thread.
 *
 * @param e error message
 */
workerPort.onerror = (e: ErrorEvent) => {
}

结果输出

image.png