uniapp微信小程序华为鸿蒙定时器熄屏停止

背景

在使用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!

相关推荐
donecoding4 分钟前
Corepack 完全解析:从懵到懂,包管理器自由了
前端·node.js·前端工程化
yqcoder7 分钟前
端经典面试题:为什么 0.1 + 0.2 !== 0.3?
前端·css
ZC跨境爬虫12 分钟前
跟着 MDN 学 HTML day_12:(HTML网页图片嵌入)
前端·javascript·css·ui·html
光影少年18 分钟前
reeact虚拟DOM、Diff算法原理、key的作用与为什么不能用index
前端·react.js·掘金·金石计划
用户0595401744623 分钟前
大模型记忆存储踩坑实录:LangChain 的 ConversationBufferMemory 让我排查了 6 小时
前端·css
是上好佳佳佳呀30 分钟前
【前端(十二)】JavaScript 函数与对象笔记
前端·javascript·笔记
你真的快乐吗1 小时前
@fuxishi/svg-icon:一个 Vue 3 svg本地图标+iconify图标组件库,让图标管理不再头疼
前端·vue.js·typescript
Rkgua1 小时前
ESModule和Commonjs模块的区别
前端·javascript
江南十四行1 小时前
ReAct Agent 基本理论与项目实战(二)
前端·react.js·前端框架
用户600071819101 小时前
【翻译】React 如何乱序流式输出 UI,却仍保持最终顺序
前端