HarmonyOS:EventHub-事件中心

一,介绍

EventHub 类似Android中的EventBus ,可用于事件传递,提供了订阅,取消订阅,触发事件的能力。但是EventHub不是全局的事件中心,事件的订阅,取消和触发都作用在某一个具体的EventHub对象上。因此不同的EventHub对象之间无法传递事件,也不可用于跨进程通信。

二,使用

1,获取EventHub对象

EventHub对象存在于UIAbilityContext 中,所以在UIAbility中可以通过this.context获取:

this.context.eventHub

在页面或是组件中可以通过 getContext() as common.UIAbilityContext 获取:

let context: common.UIAbilityContext = (getContext() as common.UIAbilityContext)
let eventHub: common.EventHub = context.eventHub

2,订阅事件

this.context.eventHub.on('event', (data: string) => {
      console.error('event: ' + data)
})
//系统源码
on(event: string, callback: Function): void;

参数:

event:对应事件key值,表示只接受这一key值事件;

callback:事件回调,可接收传递的参数,参数可以有多个。

这里要注意this指向的问题,eg:

private value: string = '123'
private onEvent() {
  console.error('event value = ' + this.value)
}

this.context.eventHub.on('event', this.onEvent)

callback被emit触发时,调用方是EventHub对象。所以在回调函数onEvent()中 this.value中的this指的是EventHub对象,而在EventHub对象中没有value值,所以打印出的值是undefind。可以通过使用=>函数解决:

this.context.eventHub.on('event', () => {
   console.error(TAG, 'value = ' + this.value)
})

或者在=>函数中调用onEvent()。

3,发送事件

this.context.eventHub.emit('event', 'event data')

可同时传递多个参数:

emit(event: string, ...args: Object[]): void;

4,取消订阅

在页面的aboutToDisappear()中取消订阅:

callback: Function = () => {
  console.error('value = ' + this.value)
}

aboutToDisappear(): void {
  this.context.eventHub.off('event', this.callback)
}

系统源码:

off(event: string, callback?: Function): void;

参数:

event:需要取消订阅的事件 key;

callback:取消指定事件的订阅 ,不传时取消事件key下所有的事件订阅。

三,注意事项

  • 不同context对象下的EvengHub对象不能进行事件传递,不能用于进程间的事件传递;
  • 订阅事件中的this指向问题;
  • 取消订阅时callback不传时会取消事件key下所有的事件订阅;
  • 不具有生命周期感知能力,要手动调用off取消订阅。

如果需要感知生命周期,跨进程通信可以参考LiveEventBus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值