HarmonyOS实战:打造极简HEventBus事件通知

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 本文介绍了在鸿蒙开发中实现类似EventBus的HEventBus工具,支持事件注册、反注册及多处接收等功能,适用于页面间通信。内容包含单例模式实现、事件管理与消息发送机制,适合日常开发使用。

前言

事件通知在日常开发中十分重要,不同页面之间的事件通信都会用到事件通知,作为 Android 开发的小伙伴相信都用过 EventBus,LiveDataEventBus 等事件通信工具。鸿蒙开发中也同样需要一个页面之间通信等工具,本篇文章教你在鸿蒙开发中如何实现一个 HEventBus,建议点赞收藏!

需求分析

  • 全局只存在唯一实例。
  • 支持事件注册,反注册。
  • 支持一次发送,多处接收。

技术实现

单例实现

在鸿蒙中使用创建静态对象实现单例,首先定义一个私有的静态成员变量defaultInstance

,提供一个静态方法 getDault ()方法返回单例对象。

private static defaultInstance: HEventBus
 static getDefault(): HEventBus {
    if (HEventBus.defaultInstance == undefined) {
      HEventBus.defaultInstance = new HEventBus();
    }
    return HEventBus.defaultInstance
  }

事件注册与反注册

  1. 事件注册,首先提供一个字符串参数为 eventName,用来区分不同的消息事件。然后提供一个 eventId 用来绑定当前页面,如果不同页面接收一个相同的事件通知,不使用 eventId 绑定页面,就会出现一个页面反注册 HEvent,就会导致其他页面接收不到事件通知,在 Android 中一般使用 this 作为当前页面的标识,也就是当前的 Activity ,Fragment 或 View。而在鸿蒙中只有Component,而且无法使用 this 代表当前页面。这个时候就要使用一个唯一的 id 作为事件的唯一标识。这个 id 十分关键,这里使用this.getUniqueId()作为当前页面的唯一标识。第三个参数就是事件  ESObject,接收事件传递的参数。
register(eventName: string, eventId: number | string, method: ESObject) {
    let result = this.eventMessages.filter((model) => {
      return model.eventName == eventName
    })
    if (result.length == 0) {
      let message = new HEventBusMessage()
      message.eventName = eventName
      this.eventMessages.push(message)
    }
    this.eventMessages.forEach((message) => {
      if (message.eventName == eventName) {
        let model = new HEventBusModel()
        model.eventId = eventId
        model.method = method
        message.models.push(model)
      }
    })
  }
  1. 反注册,反注册就比较简单了,通过 forEach 循环过滤出事件名称与事件 id 不同的消息,直接返回,此时就将当前注册从数组中移除了。
unregister(eventName: string, eventId: number | string) {
    this.eventMessages.forEach((message)=>{
      if (message.eventName == eventName) {
         message.models = message.models.filter((model)=>{
           return model.eventId != eventId
         })
      }
    })
  }

3.消息发送,通过数组遍历找到事件名称相同的事件发送,参数为 Object。

post(eventName: string,arg: Object){
    this.eventMessages.forEach((message)=>{
      if (message.eventName == eventName) {
          message.models.forEach((model)=>{
            model.method(arg)
          })
      }
    })
  }

4.清除消息,直接将数组清空即可。

clear(){
    this.eventMessages = []
  }

总结

事件通知在实际开发中十分重要,使用场景也比较多,根据实际开发场景使用事件通知 HEventBus,由于篇幅限制本文只提供了部分代码,完整代码请联系作者,已经学会了的小伙伴,赶快动手试试吧。

目录
相关文章
|
1月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
379 37
|
1月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
204 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
122 0
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
238 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
522 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
鸿蒙应用开发从入门到实战(十六):线性布局案例
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文通过简单案例演示如何使用Column和Row组件实现线性布局。
148 1
|
2月前
|
开发者 容器
鸿蒙应用开发从入门到实战(十四):ArkUI组件Column&Row&线性布局
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Column和Row组件的使用以及线性布局的方法。
274 12
|
2月前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供滑块Slider与进度条Progress组件,用于鸿蒙原生APP开发。Slider支持拖动调节音量、亮度等,可设步长、方向及提示气泡;Progress支持线性、环形等多种样式,可自定义颜色、宽度与刻度,实时显示任务进度。
232 2
|
2月前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解滑块Slider和进度条Progress组件的使用。
165 1
|
2月前
|
开发者
鸿蒙应用开发从入门到实战(十二):ArkUI组件Button&Toggle
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解按钮组件Button和Toggle的使用。
290 2
下一篇
oss云网关配置