鸿蒙harmony--线程间处理和发送事件Emitter

想的太多生活中就全是问题,可当你开始行动,这些问题其实都是有答案的,解决焦虑的最好方式,就是把所有的问题都落实到行动上,当你真正开始行动起来,你就会发现这些问题,其实都不是问题!
目录

一,定义

二,主要API

2.1EventPriority

[2.2 emitter.on](#2.2 emitter.on)

[2.3 emitter.once](#2.3 emitter.once)

[2.4 emitter.off](#2.4 emitter.off)

[2.5 emitter.emit](#2.5 emitter.emit)

[2.6 InnerEvent](#2.6 InnerEvent)

[2.7 EventData](#2.7 EventData)

三,使用

一,定义

类似于android中的EventBus线程间发送事件和处理事件,鸿蒙采用了Emitter来提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。

二,主要API

2.1EventPriority

用于表示事件被发送的优先级。

系统能力 : SystemCapability.Notification.Emitter

名称 说明
IMMEDIATE 0 表示事件被立即投递。
HIGH 1 表示事件先于LOW优先级投递。
LOW 2 表示事件优于IDLE优先级投递,事件的默认优先级是LOW。
IDLE 3 表示在没有其他事件的情况下,才投递该事件。

2.2 emitter.on

on(event: InnerEvent, callback: Callback<EventData>): void

持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。

参数:

参数名 类型 必填 说明
event InnerEvent 持续订阅的事件,其中EventPriority,在订阅事件时无需指定,也不生效
callback Callback<EventData> 接收到该事件时需要执行的回调处理函数

2.3 emitter.once

once(event: InnerEvent, callback: Callback<EventData>): void

单次订阅指定的事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。

参数:

参数名 类型 必填 说明
event InnerEvent 单次订阅的事件,其中 EventPriority ,在订阅事件时无需指定,也不生效
callback Callback<EventData> 接收到该事件时需要执行的回调处理函数

2.4 emitter.off

off(eventId: number, callback: Callback<EventData>): void

取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。

参数:

参数名 类型 必填 说明
eventId number 事件ID
callback10+ Callback<EventData> API version 10 新增取消该事件的回调处理函数。

2.5 emitter.emit

emit(event: InnerEvent, data?: EventData): void

发送指定的事件。

参数:

参数名 类型 必填 说明
event ​​​​​​​InnerEvent 发送的事件,其中EventPriority用于指定事件被发送的优先级
data EventData 事件携带的数据

2.6 InnerEvent

订阅或发送的事件,订阅事件时EventPriority不生效。

名称 类型 可读 可写 说明
eventId number 事件ID,由开发者定义用来辨别事件。
priority EventPriority 事件被投递的优先级。

2.7 EventData

发送事件时传递的数据。

名称 类型 可读 可写 说明
data [key: string]: any 发送事件时传递的数据,数据类型支持字符串、整型和布尔型。 其中字符串长度最大为10240字节。

三,使用

①简单封装一个EventBus单例:

TypeScript 复制代码
import emitter from '@ohos.events.emitter'

export default class EventBus{

  private static instace: EventBus

  private constructor() {

  }
  static getInstance(): EventBus {
    if (!EventBus.instace) {
      EventBus.instace = new EventBus()
    }
    return EventBus.instace
  }

  //持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。
  on(name:number,callback:(eventData:emitter.EventData)=>void){
    let event :emitter.InnerEvent={
      eventId:name, //事件ID
      priority:emitter.EventPriority.IMMEDIATE //事件立即被投递
    }
    emitter.on(event,callback)
  }

 
  //取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。
  unregister(name:number){
    emitter.off(name)
  }
  //发送指定的事件
   post(name:number,data?:emitter.EventData){
     let event :emitter.InnerEvent={
       eventId:name, //事件ID
       priority:emitter.EventPriority.IMMEDIATE //事件立即被投递
     }
     let eventdata: emitter.EventData = {
       data:data
     }
     emitter.emit(event,eventdata)
   }

}

②,定义事件id

TypeScript 复制代码
export enum AppEvent{
  EVENT_TEST = 1,
  EVENT_TEST2 = 2,
  EVENT_TEST3 = 3,
}

③发送事件

TypeScript 复制代码
import EventBus from './EventBus'
import { AppEvent } from './AppEvent'
import emitter from '@ohos.events.emitter'

@Entry
@Component
struct SecondPage {
  build() {
    Column() {
      Text("第二页").onClick(()=>{
        let data:emitter.EventData ={data:{
          name:"袁震",
        }}
        EventBus.getInstance().post(AppEvent.EVENT_TEST,data)
      })

    }.width("100%").height("100%")
  }
}

④,订阅事件,解绑事件

TypeScript 复制代码
import { AppEvent } from './AppEvent'
import EventBus from './EventBus'

@Entry
@Component
struct FirstPage {


  aboutToAppear(){
      EventBus.getInstance().on(AppEvent.EVENT_TEST,(data)=>{
          console.info("yz----data:"+data.data)
      })
  }

  aboutToDisappear(){
    EventBus.getInstance().unregister(AppEvent.EVENT_TEST)
  }

  build() {
    Flex({direction: FlexDirection.Row,wrap: FlexWrap.Wrap}) {
      Text('袁震1').flexBasis('auto').width('25%').height(50).backgroundColor("#D2d28C")
      Text('袁震2').flexBasis(100).height(60).backgroundColor("#554433")
      Text('袁震3').flexBasis(200).width('35%').height(70).backgroundColor("#668888")
      Text('袁震3').width('40%').height(70).backgroundColor("#6688cc").flexBasis('60%')
      Text('袁震3').width('45%').height(70).backgroundColor("#668822").flexBasis('70%')
      Text('袁震3').width('50%').height(70).backgroundColor("#668866").flexBasis('80%')
    }.width("100%").height("100%")
  }
}

使用很简单,和android框架EventBus也是非常相似

相关推荐
Damon小智4 小时前
HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别
华为·harmonyos
匹马夕阳6 小时前
华为笔记本之糟糕的体验
华为·笔记本电脑
egekm_sefg6 小时前
华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数
网络·华为
岳不谢20 小时前
华为DHCP高级配置学习笔记
网络·笔记·网络协议·学习·华为
爱笑的眼睛1121 小时前
uniapp 极速上手鸿蒙开发
华为·uni-app·harmonyos
K.P1 天前
鸿蒙元服务从0到上架【第三篇】(第二招有捷径)
华为·harmonyos·鸿蒙系统
K.P1 天前
鸿蒙元服务从0到上架【第二篇】
华为·harmonyos·鸿蒙系统
敲代码的小强1 天前
Flutter项目兼容鸿蒙Next系统
flutter·华为·harmonyos
程序猿会指北1 天前
纯血鸿蒙APP实战开发——Text实现部分文本高亮和超链接样式
移动开发·harmonyos·arkts·openharmony·arkui·组件化·鸿蒙开发
鸿蒙自习室1 天前
鸿蒙开发——关系型数据库的基本使用与跨设备同步
前端·数据库·华为·harmonyos·鸿蒙