退出页面释放监听

更新时间:

在蓝河应用开发中,正确处理页面生命周期末端的资源释放是保障应用性能的关键。以下规范针对页面销毁阶段(onDestroy)必须执行的三类资源清理操作。

定时器资源释放

推荐级别:强烈

所有通过 setTimeout/setInterval 创建的计时器,必须在页面销毁时通过 clearTimeout/clearInterval 进行匹配清除。

反例

export default {
  onInit() {
    // 未记录定时器引用
    setTimeout(() => {
      // 业务逻辑
    }, 1000)
    setInterval(() => {
      // 周期任务
    }, 1000)
  },
  onDestroy() {}, // 未执行清理
}
复制代码

正例

// 声明模块级变量存储计时器ID
let timeoutId
let intervalId

export default {
  onInit() {
    timeoutId = setTimeout(() => {
      // 业务逻辑
    }, 1000)

    intervalId = setInterval(() => {
      // 周期任务
    }, 1000)
  },

  onDestroy() {
    // 精确清除计时器
    clearTimeout(timeoutId)
    clearInterval(intervalId)
  },
}
复制代码

事件监听器注销

推荐级别:强烈

页面中使用的监听类接口(如 feature、C2JS 等),页面退出时必须清除监听。原因同上。

反例

import event from '@blueos.app.event.eventManager'

export default {
  onInit() {
    // 未记录订阅ID
    event.subscribe({
      eventName: 'usual.event.SCREEN_AOD',
      callback: (res) => {
        // 事件处理
      },
    })
  },
  onDestroy() {}, // 监听器未注销
}
复制代码

正例

import event from '@blueos.app.event.eventManager'

// 使用容器存储多订阅ID
const eventSubscriptions = []

export default {
  onInit() {
    const subscriptionId = event.subscribe({
      eventName: 'usual.event.SCREEN_AOD',
      callback: (res) => {
        // 事件处理
      },
    })
    eventSubscriptions.push(subscriptionId)
  },

  onDestroy() {
    // 批量注销所有事件监听
    eventSubscriptions.forEach((id) => event.unsubscribe({ id }))
    eventSubscriptions.length = 0 // 清空ID容器
  },
}
复制代码