背景
在使用uniapp的开发微信小程序过程中,部分华为鸿蒙手机出现定时器倒计时熄屏停止情况,重新打开后倒计时停止刷新。本文针对这一问题给出几种解决方案。
方案一:onShow时校准
每次切换重新计算,避免停止情况。这种方式有一个问题,那就是组件内无法使用生命周期,只能进行传递,影响改动较大。
方案二:执行时修正
还有一种方式,不依赖生命周期。每次使用定时器,自动计算之前剩余时间与当前时间和结束时间的剩余时间,如果两者误差较大,则重新计算。
示例代码:
ini
// 设置定时器
this.timer = setInterval(() => {
remainingMs -= 1000;
// 计算误差
const currentDiff = endMoment.diff(moment())
const errorDiff = remainingMs - currentDiff
console.log('打印***currentDiff,remainingMs', errorDiff)
if (remainingMs <= 0 || errorDiff > 2000) {
clearInterval(this.timer);
this.timer = null;
updateDisplay();
_this.init()
return;
}
updateDisplay();
}, 1000);
- 使用
moment().diff()
获取真实的剩余时间,作为校准依据。 errorDiff
判断定时器是否因系统休眠等原因导致计时不准。- 设定一个误差阈值(如 2000ms),超过则认为定时器失效,触发重新计算或刷新。
总结
最后总结一下:当出现定时器停止的情况,可以使用生命周期或者执行时修正方式,推荐使用基于真实时间戳实时计算剩余时间的方式实现倒计时,避免依赖易被系统挂起的定时器,确保熄屏前后计时准确。
如有错误,请指正O^O!