想的太多生活中就全是问题,可当你开始行动,这些问题其实都是有答案的,解决焦虑的最好方式,就是把所有的问题都落实到行动上,当你真正开始行动起来,你就会发现这些问题,其实都不是问题!
目录
一,定义
二,主要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来提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。
用于表示事件被发送的优先级。
系统能力: SystemCapability.Notification.Emitter
名称 | 值 | 说明 |
---|---|---|
IMMEDIATE | 0 | 表示事件被立即投递。 |
HIGH | 1 | 表示事件先于LOW优先级投递。 |
LOW | 2 | 表示事件优于IDLE优先级投递,事件的默认优先级是LOW。 |
IDLE | 3 | 表示在没有其他事件的情况下,才投递该事件。 |
on(event: InnerEvent, callback: Callback
持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
event | InnerEvent | 是 | 持续订阅的事件,其中EventPriority,在订阅事件时无需指定,也不生效 |
callback | Callback |
是 | 接收到该事件时需要执行的回调处理函数 |
once(event: InnerEvent, callback: Callback
单次订阅指定的事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
event | InnerEvent | 是 | 单次订阅的事件,其中 EventPriority ,在订阅事件时无需指定,也不生效 |
callback | Callback |
是 | 接收到该事件时需要执行的回调处理函数 |
off(eventId: number, callback: Callback
取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
eventId | number | 是 | 事件ID |
callback10+ | Callback |
是 | API version 10 新增取消该事件的回调处理函数。 |
emit(event: InnerEvent, data?: EventData): void
发送指定的事件。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
event | InnerEvent | 是 | 发送的事件,其中EventPriority用于指定事件被发送的优先级 |
data | EventData | 否 | 事件携带的数据 |
订阅或发送的事件,订阅事件时EventPriority
不生效。
名称 | 类型 | 可读 | 可写 | 说明 |
---|---|---|---|---|
eventId | number | 是 | 是 | 事件ID,由开发者定义用来辨别事件。 |
priority | EventPriority | 是 | 是 | 事件被投递的优先级。 |
发送事件时传递的数据。
名称 | 类型 | 可读 | 可写 | 说明 |
---|---|---|---|---|
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也是非常相似