在HarmonyOS中,全局事件总线(EventBus)订阅应放哪?如何避免内存泄漏?

我在组件里用全局 EventBus(或系统订阅)收消息,如果不解绑会内存泄漏。正确的订阅/解绑放在哪些回调?

阅读 551
1 个回答

在 aboutToAppear() 里订阅(实例构建前就位,不影响首帧)。

在 aboutToDisappear() 里取消订阅(包括被 Pop 销毁)。

如果是可复用组件,还可在 aboutToRecycle() 里解绑,aboutToReuse() 重绑。

// pages/EventBusSafe.ets
type Listener = (msg: string) => void
class Bus {
  private static ls = new Set<Listener>()
  static on(fn: Listener) { this.ls.add(fn) }
  static off(fn: Listener) { this.ls.delete(fn) }
  static emit(msg: string) { this.ls.forEach(fn => fn(msg)) }
}

@Entry
@Component
struct BusConsumer {
  @State lastMsg: string = '-'
  private handler: Listener = (m) => { this.lastMsg = m }

  aboutToAppear() {
    Bus.on(this.handler)
  }
  aboutToDisappear() {
    Bus.off(this.handler)
  }

  build() {
    Column({ space: 12 }) {
      Text(`收到:${this.lastMsg}`).fontSize(18)
      Button('发消息').onClick(() => Bus.emit('Hello@' + Date.now()))
    }.padding(16)
  }
}