退出页面释放监听
退出页面释放监听
Section titled “退出页面释放监听”在蓝河应用开发中,正确处理页面生命周期末端的资源释放是保障应用性能的关键。以下规范针对页面销毁阶段(onDestroy)必须执行的三类资源清理操作。
定时器资源释放
Section titled “定时器资源释放”推荐级别:强烈
所有通过 setTimeout/setInterval 创建的计时器,必须在页面销毁时通过 clearTimeout/clearInterval 进行匹配清除。
反例
export default { onInit() { // 未记录定时器引用 setTimeout(() => { // 业务逻辑 }, 1000) setInterval(() => { // 周期任务 }, 1000) }, onDestroy() {}, // 未执行清理}正例
// 声明模块级变量存储计时器IDlet timeoutIdlet intervalId
export default { onInit() { timeoutId = setTimeout(() => { // 业务逻辑 }, 1000)
intervalId = setInterval(() => { // 周期任务 }, 1000) },
onDestroy() { // 精确清除计时器 clearTimeout(timeoutId) clearInterval(intervalId) },}事件监听器注销
Section titled “事件监听器注销”推荐级别:强烈
页面中使用的监听类接口(如 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'
// 使用容器存储多订阅IDconst 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容器 },}