想的太多生活中就全是问题,可当你开始行动,这些问题其实都是有答案的,解决焦虑的最好方式,就是把所有的问题都落实到行动上,当你真正开始行动起来,你就会发现这些问题,其实都不是问题!
目录
一,定义
二,主要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
用于表示事件被发送的优先级。
系统能力:
名称 | 值 | 说明 |
---|---|---|
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
订阅或发送的事件,订阅事件时
名称 | 类型 | 可读 | 可写 | 说明 |
---|---|---|---|---|
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也是非常相似