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) => {
}