鸿蒙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<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单例:

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