鸿蒙:使用Emitter进行线程间通信

前言:

官方文档上说,Emitter是一种作用在进程内的事件处理机制,为应用程序提供订阅事件、发布事件、取消事件订阅的能力。

我们学习这个工具之前,还是老样子,照着官方文档和示例学习与实践,文档链接如下:

文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/itc-with-emitter如果您看完了,但还有点迷糊,不妨看看我是怎么封装这个工具的。

下面是我运行的实际效果图和封装后的代码:

Index.ets

复制代码
import { emitterUtil } from "./EmitterUtil"

// emitter使用示例
@Entry
@Component
export struct Index {
  build() {
    Column({ space: 20 }) {
      Button("emitter.fire")
        .onClick(() => {
          emitterUtil.fire()

        })

      Button("emitter.on")
        .onClick(() => {
          emitterUtil.on()

        })

      Button("emitter.off")
        .onClick(() => {
          emitterUtil.off()

        })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)

  }
}
复制代码
EmitterUtil.ets
复制代码
import { emitter } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';

class EmitterUtil {
  id: number = 1;

  // 订阅事件
  on() {
    // 定义一个eventId为1的事件。
    let event: emitter.InnerEvent = {
      eventId: 1
    };
    // 定义一个事件的回调处理函数,当收到对应的事件后执行回调函数
    let callback: Callback<emitter.EventData> = (eventData: emitter.EventData) => {
      console.info(`eventData:接收成功 ${JSON.stringify(eventData)}`);
    }

    // 收到eventId为1的事件后执行回调函数
    emitter.on(event, callback);

    // 订阅成功
    promptAction.showToast({ message: "订阅成功!" })
  }

  // 发送事件
  fire() {
    this.id = this.id + 1;
    // 定义一个eventId为1的事件,事件优先级为Low。
    let event: emitter.InnerEvent = {
      eventId: 1,
      priority: emitter.EventPriority.LOW
    };

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

    // 发送eventId为1的事件,事件内容为eventData。
    emitter.emit(event, eventData);
    promptAction.showToast({ message: "发送成功!id是" + this.id })

  }

  // 取消事件
  off() {
    // 取消eventId为1的事件。
    emitter.off(1);
    promptAction.showToast({ message: "取消成功!" })
  }
}

export const emitterUtil = new EmitterUtil();

以上是个人经验分享

相关推荐
李游Leo10 小时前
HarmonyOS 7 DualCart 平行视界适配实录 04:EasyGo × 虚拟容器:商品比价双详情与分栏比例策略【鸿蒙心迹】
华为·harmonyos
李游Leo11 小时前
HarmonyOS 7 PixelBridge 原生库适配实录 06:Release 性能基线、资源释放、包体积与工程化验收【鸿蒙心迹】
华为·harmonyos
传奇开心果编程11 小时前
【ArkUI进阶练中学】第11课:安全与合规进阶
学习·ui·华为·harmonyos
熊猫钓鱼>_>13 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 Reaktive 实现响应式原语适配(完整版 · 含摘要目录与技术图表)
华为·kotlin·大模型·ai编程·harmonyos·适配·reaktive
李游Leo16 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
熊猫钓鱼>_>16 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 MVIKotlin 实现单向数据流适配
华为·ai编程·鸿蒙·openharmony·适配·数据流·mvkotlin
传奇开心果编程16 小时前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
传奇开心果编程18 小时前
【ArkUI进阶练中学】第13课:元服务与卡片开发
学习·ui·华为·harmonyos
李游Leo19 小时前
HarmonyOS 7 InsightBoard 多形态适配实录 06:ArkUI × 多设备回归:布局抖动、监听释放与全形态验收【鸿蒙心迹】
回归·kotlin·harmonyos