EventHub 、Emitor 订阅、取消,以及进程间通信 系统广播,网络监听

221 阅读2分钟

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主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。不是线程通信也可以用哟

订阅

订阅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