HarmonyOS 鸿蒙Next setInterval倒计时 在倒计时的状态下收起APP,回到桌面,倒计时时间不准确

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next setInterval倒计时 在倒计时的状态下收起APP,回到桌面,倒计时时间不准确

app中,获取验证码按钮的倒计时使用了setInterval,在倒计时时收起APP到桌面,1分钟之后打开app,倒计时只走了10秒左右。

当前使用方式:setInterval,1分种后clearInterval。
看了文档的短时任务,24小时配额默认为10分钟,配额消耗完后不允许再申请短时任务,如果多次获取验证码导致配额消耗完,后续又会出现上述问题。又不太像是需要长时任务app。
 


更多关于HarmonyOS 鸿蒙Next setInterval倒计时 在倒计时的状态下收起APP,回到桌面,倒计时时间不准确的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

TextTimer组件提供了通过文本显示计时信息并控制其计时器状态的功能。

具体连接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-texttimer-V5

可参考下面demo

@Entry

@Component

struct TextTimerExample {

  textTimerController: TextTimerController = new TextTimerController()

  @State format: string = 'ss'

  build() {

    Column() {

      Row(){

        TextTimer({ isCountDown: true, count: 59000, controller: this.textTimerController })

          .format(this.format)

          .fontColor(Color.Black)

          .fontSize(50)

          .onTimer((utc: number, elapsedTime: number) => {

            console.info('textTimer notCountDown utc is:' + utc + ', elapsedTime: ' + elapsedTime)

          })

        Text("秒")

      }

      Row() {

        Button("start").onClick(() => {

          this.textTimerController.start()

        })

        Button("pause").onClick(() => {

          this.textTimerController.pause()

        })

        Button("reset").onClick(() => {

          this.textTimerController.reset()

        })

      }

    }

  }

}

更多关于HarmonyOS 鸿蒙Next setInterval倒计时 在倒计时的状态下收起APP,回到桌面,倒计时时间不准确的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以用textTimer来实现倒计时,下面是个简单的demo,可供参考:

@Entry
@Component
struct Page {
  @State elapsedTime: number = 0;
  textTimerController: TextTimerController = new TextTimerController()


  build() {
    Column() {
      Row() {
        Button('发送验证码')
          .onClick(() => {
            this.textTimerController.start()
          })
        TextTimer({ isCountDown: true, count: 59000, controller: this.textTimerController })
          .format("s")
          .onTimer((utc: number, elapsedTime: number) => {
            this.elapsedTime = elapsedTime
          })
      }
      .margin({ top: 25 })
      .visibility(this.elapsedTime == 59000 ? Visibility.None : Visibility.Visible)

      Button('重新发送')
        .onClick(() => {
          this.textTimerController.reset()
          this.textTimerController.start()
        })
    }
    .width('100%')
    .height('100%')
  }
}

在HarmonyOS鸿蒙Next系统中,使用setInterval进行倒计时时,若应用在倒计时过程中被收起并回到桌面,由于系统资源管理和进程调度的原因,setInterval的精确度可能会受到影响。

HarmonyOS为了优化资源使用,可能会将后台应用的执行频率降低,导致setInterval的回调不再按预期的时间间隔触发。这种情况下,倒计时时间可能会出现偏差。

为了应对这一问题,开发者可以考虑以下几种方式(注意,这里不给出具体代码或建议,仅说明思路):

  1. 使用系统定时任务:探索HarmonyOS提供的系统级定时任务API,这些API通常能在应用不在前台时保持较高的精度。

  2. 持久化计时状态:在应用被收起时,将当前的计时状态持久化(如保存到本地文件或数据库),并在应用重新打开时恢复该状态,同时根据系统时间进行校准。

  3. 前台服务:如果业务逻辑允许,可以考虑使用前台服务来保持应用的部分功能在后台运行,但这会影响用户体验和电池续航。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部