EventHub 相当于广播 和 Emitor 消息传递 默认是非粘性事件,订阅之后,再发才能收到
无论emitor还是 EventHub 当@Entry销毁的时候还会存在,但是又没办法只取消单个,所以只能靠一下自增的id,来去使用,EventHub没有id ,所以这个很难办
eventId:number = this.getEventId()
innerEmitter: emitter.InnerEvent = {
eventId: this.eventId,
}
// 订阅id
emitter.on(this.innerEmitter, (data) => {}
// 根据id取消
emitter.off(this.eventId)
EventHub为UIAbility组件提供了事件机制,使它们能够进行订阅、取消订阅和触发事件等数据通信能力。
订阅 EventHub.on
订阅可以订阅多个参数
getContext().eventHub.on(EVENT_NEW, (data: string) => {
})
getContext(this).eventHub.on(EVENT_NEW, this.setJson)
setJson(data: string, name: string) {
console.log(`收到了 ${data} , name = ${name}`)
}
取消 EventHub.off
在 aboutToDisappear 中取消,如果是这种取消,那么所有订阅的这个EVENT_NEW都不会再接收到
getContext(this).eventHub.off(EVENT_NEW)
发送 EventHub.emit
发送可以发送多个参数
getContext(this).eventHub.emit(EVENT_NEW, '发送了一个json', '2222')
Emitter
Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。不是线程通信也可以用哟
- emitter.on
- emitter.on
- emitter.once
- emitter.once
- emitter.off
- emitter.off
- emitter.off
- emitter.off
- emitter.emit
- emitter.emit
- emitter.emit
- emitter.getListenerCount
订阅
订阅1次或者是一直订阅,在不需要的时候off掉
emitter.on(EVENT_KEY, (data) => {
let content: string = data.data?.content as string
let contentId: string = data.data?.contentId as string
let id: string = data.data?.id as string
console.log(`on => ${content} ${contentId} ${id}`)
this.message = JSON.stringify(data.data)
})
emitter.once(EVENT_KEY, (data) => {
let content: string = data.data?.content as string
let contentId: string = data.data?.contentId as string
let id: string = data.data?.id as string
console.error(`once => ${content} ${contentId} ${id}`)
this.message = JSON.stringify(data.data)
})
发送
emitter.emit(EVENT_KEY, {
data: {
content: "发送的信息",
contentId: "contentId",
user: this.user
}
})
取消
emitter.emit(EVENT_KEY)
进程间通信 commonEventManager
创建订阅着
不用的时候需要反注册
//用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
subscriber: commonEventManager.CommonEventSubscriber | null = null
注册subscribe
aboutToAppear(): void {
//创建订阅者 订阅关于 user 的
this.subscriber = commonEventManager.createSubscriberSync({
events: ['user']
})
commonEventManager.subscribe(this.subscriber, (error: BusinessError, data: commonEventManager.CommonEventData) => {
if (error) {
console.error(`订阅失败, code is ${error.code}, message is ${error.message}`);
} else {
console.info(`订阅成功, 收到了 ${data.event} ${JSON.stringify(data)}}`);
}
})
}
发送publish
// 发送一个user的串
commonEventManager.publish("user", (error: BusinessError) => {
if (error) {
promptAction.showToast({ message: '发送失败' })
}
});
反注册 unsubscribe
commonEventManager.unsubscribe(this.subscriber, (error: BusinessError) => {
});
系统公共事件,比如网络状态
这个不知道是wife 还是 4g
//创建订阅者 订阅关于 user 的
this.subscriber = commonEventManager.createSubscriberSync({
events: [
'usual.event.CONNECTIVITY_CHANGE',// 各类网络(以太网、WIFI、蜂窝等)在发生连接状态状态变化时(断开、断开中、连接中、已连接等),将会触发事件通知服务发布该系统公共事件。
]
})
commonEventManager.subscribe(this.subscriber, (error: BusinessError, data: commonEventManager.CommonEventData) => {
if (error) {
console.error(`订阅失败, code is ${error.code}, message is ${error.message}`);
} else {
let netType: number = data.parameters?.NetType
// 2 连接中
// 3 已连接
// 4 正在断开
// 5 已断开
let normalString:string = ''
switch (netType) {
case 2:
normalString = '连接中'
break
case 3:
normalString = '已连接'
break
case 4:
normalString = '正在断开'
break
case 5:
normalString = '已断开'
break
}
console.info(`订阅成功, 收到了 ${data.event} ${JSON.stringify(data)}}`);
}
})
权限
ohos.permission.GET_NETWORK_INFO