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

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

目录

一,定义

二,主要API

2.1EventPriority

2.2 emitter.on

 2.3 emitter.once

2.4 emitter.off

2.5 emitter.emit

2.6 InnerEvent

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): void

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

参数:

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

 2.3 emitter.once

once(event: InnerEvent, callback: Callback): void

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

参数:

参数名 类型 必填 说明
event InnerEvent 单次订阅的事件,其中

EventPriority ,在订阅事件时无需指定,也不生效

callback Callback 接收到该事件时需要执行的回调处理函数

2.4 emitter.off

off(eventId: number, callback: Callback): void

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

参数:

参数名 类型 必填 说明
eventId number 事件ID
callback10+ Callback 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单例:

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

export enum AppEvent{
  EVENT_TEST = 1,
  EVENT_TEST2 = 2,
  EVENT_TEST3 = 3,
}

③发送事件

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%")
  }
}

④,订阅事件,解绑事件

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也是非常相似

你可能感兴趣的:(鸿蒙开发,harmonyos,华为,Harmony,鸿蒙)