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

发布时间:2024年01月19日

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

目录

一,定义

二,主要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

名称说明
IMMEDIATE0表示事件被立即投递。
HIGH1表示事件先于LOW优先级投递。
LOW2表示事件优于IDLE优先级投递,事件的默认优先级是LOW。
IDLE3表示在没有其他事件的情况下,才投递该事件。

2.2?emitter.on

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

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

参数:

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

?2.3?emitter.once

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

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

参数:

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

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

callbackCallback<EventData>接收到该事件时需要执行的回调处理函数

2.4?emitter.off

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

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

参数:

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

2.5?emitter.emit

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

发送指定的事件。

参数:

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

2.6?InnerEvent

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

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

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

文章来源:https://blog.csdn.net/y2653904/article/details/135706913
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。