HarmonyOS:使用Emitter进行线程间通信

Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。

一、Emitter的开发步骤如下:

  1. 订阅事件
import { emitter } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = 'ThreadModel';
const DOMAIN_NUMBER: number = 0xFF00;

// 定义一个eventId为1的事件
let event: emitter.InnerEvent = {
  eventId: 1
};

// 收到eventId为1的事件后执行该回调
let callback = (eventData: emitter.EventData): void => {
  promptAction.showToast({
    message: JSON.stringify(eventData)
  });
  hilog.info(DOMAIN_NUMBER, TAG, 'event callback:' + JSON.stringify(eventData));
};

// 订阅eventId为1的事件
emitter.on(event, callback);
promptAction.showToast({
  message: JSON.stringify('emitter subscribe success')
});
  1. 发送事件
// 定义一个eventId为1的事件,事件优先级为Low
let event: emitter.InnerEvent = {
  eventId: 1,
  priority: emitter.EventPriority.LOW
};

let eventData: emitter.EventData = {
  data: {
    content: 'c',
    id: 1,
    isEmpty: false
  }
};

// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);

二、示例效果图

订阅事件


发送事件


三、示例完整代码

TestEmitter.ets

bash 复制代码
import { emitter } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = 'ThreadModel';
const DOMAIN_NUMBER: number = 0xFF00;

function subEvent() {
  // 定义一个eventId为1的事件
  let event: emitter.InnerEvent = {
    eventId: 1
  };

  // 收到eventId为1的事件后执行该回调
  let callback = (eventData: emitter.EventData): void => {
    promptAction.showToast({
      message: JSON.stringify(eventData)
    });
    hilog.info(DOMAIN_NUMBER, TAG, 'event callback:' + JSON.stringify(eventData));
  };

  // 订阅eventId为1的事件
  emitter.on(event, callback);
  promptAction.showToast({
    message: JSON.stringify('emitter subscribe success')
  });
}

function sendEvent() {
  // 定义一个eventId为1的事件,事件优先级为Low
  let event: emitter.InnerEvent = {
    eventId: 1,
    priority: emitter.EventPriority.LOW
  };

  let eventData: emitter.EventData = {
    data: {
      content: 'c',
      id: 1,
      isEmpty: false
    }
  };

  // 发送eventId为1的事件,事件内容为eventData
  emitter.emit(event, eventData);
}


@Entry
@Component
struct TestEmitter {
  @State message: string = 'Hello World';
  private hadSubEvent: boolean = false;

  build() {
    Column() {
      Button('订阅事件')
        .fontColor(Color.Black)
        .fontWeight(FontWeight.Normal)
        .fontSize(16)
        .margin({ top: 20 })
        .onClick((event: ClickEvent) => {
          this.hadSubEvent = true;
          subEvent()
        })
      Button('发送事件')
        .fontColor(Color.Black)
        .fontWeight(FontWeight.Normal)
        .fontSize(16)
        .margin({ top: 20 })
        .onClick((event: ClickEvent) => {
          if (this.hadSubEvent) {
            sendEvent()
            return
          } else {
            promptAction.showToast({ message: "请点击订阅事件,再发送事件" })
          }
        })

    }
    .height('100%')
    .width('100%')
  }
}
相关推荐
奔跑吧邓邓子20 分钟前
【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅
开发语言·分布式·爬虫·python·安全
C#Thread35 分钟前
C#上位机--流程控制(IF语句)
开发语言·javascript·ecmascript
牵牛老人1 小时前
Qt开发中出现中文乱码问题深度解析与解决方案
开发语言·qt
大脑经常闹风暴@小猿1 小时前
1.1 go环境搭建及基本使用
开发语言·后端·golang
奔跑吧邓邓子1 小时前
【Python爬虫(45)】Python爬虫新境界:分布式与大数据框架的融合之旅
开发语言·分布式·爬虫·python·大数据框架
Evaporator Core1 小时前
MATLAB学习之旅:数据建模与仿真应用
开发语言·学习·matlab
Zfox_2 小时前
【QT】信号与槽 & 窗口坐标
开发语言·c++·qt·qt5
张鱼小丸子2 小时前
【无标题】云原生作业六
开发语言·php
项目申报小狂人2 小时前
改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)
开发语言·算法·matlab
JD技术委员会3 小时前
Rust 语法噪音这么多,是否适合复杂项目?
开发语言·人工智能·rust