鸿蒙开发 Timer (定时器) 实现详情

目录

  • 关键点说明
  • 注意事项
  • 代码实现1
  • 代码实现2

关键点说明

  • timeoutID 的初始化:
    在类中定义一个成员变量 timeoutID,并初始化为 null。
    timeoutID 的类型为 number | null,因为 setTimeout 返回的是一个数字类型的 ID,而初始状态下没有定时器,因此可以为 null。

  • 启动定时器:
    在 startTimer 方法中,调用 setTimeout 并将返回的 ID 赋值给 this.timeoutID。
    如果 timeoutID 不为 null,说明定时器已经存在,避免重复启动。

  • 取消定时器:
    在 cancelTimer 方法中,调用 clearTimeout(this.timeoutID) 取消定时器。
    将 this.timeoutID 重置为 null,表示没有正在运行的定时器。

  • 定时器执行完成后的清理:
    在 setTimeout 的回调函数中,将 this.timeoutID 重置为 null,表示定时器已执行完毕。

注意事项

  • 避免重复启动:在启动定时器前,检查 this.timeoutID 是否为 null,避免重复启动定时器。

  • 资源清理:定时器执行完成后或取消后,及时将 this.timeoutID 重置为 null,避免内存泄漏。

  • 定时器精度:setTimeout 的延迟时间可能会受到系统负载的影响,不保证完全精确

代码实现1

@Entry
@Component
struct Page1 {
  private intervalID: number | null = null; // 初始化 intervalID 为 null
  private timeoutID: number | null = null; // 初始化 timeoutID 为 null
  build() {
    Row() {
      Column() {
        Button('开启一个定时器').onClick((event: ClickEvent) => {
          this.timeoutID =setTimeout(() => {
            console.log('---------delay 1s');
          }, 1000);
        }).margin({top:10})
        Button('关闭一个定时器').onClick((event: ClickEvent) => {
          if (this.timeoutID !== null) {
            clearTimeout(this.timeoutID); // 取消定时器
            this.timeoutID = null; // 清空 timeoutID
            console.log('-----------定时器已取消');
          } else {
            console.log('----------没有正在运行的定时器');
          }
        }).margin({top:10})
        Button('打开重复定时器').onClick((event: ClickEvent) => {
          if (this.intervalID !== null) {
            console.log('------------定时器已存在,无需重复启动');
            return;
          }
          this.intervalID = setInterval(() => {
            console.log('---------do every 1s.');
          }, 1000);
        }).margin({top:10})
        Button('关闭一个重复定时器').onClick((event: ClickEvent) => {
          if (this.intervalID !== null) {
            clearInterval(this.intervalID);// 取消定时器
            this.intervalID = null; // 清空 timeoutID
            console.log('----------重复定时器已取消');
          } else {
            console.log('---------没有正在运行的重复定时器');
          }
        }).margin({top:10})
      }
      .width('100%')
    }
    .height('100%')
  }
}

代码实现2

import timer from '@ohos.timer';

@Entry
@Component
struct TimerExample {
  private myTimer: timer.Timer | null = null; // 定时器对象

  build() {
    Column() {
      Button('启动定时器')
        .onClick(() => {
          this.startTimer();
        })
        .margin(10)

      Button('停止定时器')
        .onClick(() => {
          this.stopTimer();
        })
        .margin(10)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

  // 启动定时器
  startTimer() {
    if (!this.myTimer) {
      this.myTimer = timer.createTimer(); // 创建定时器
    }

    this.myTimer.start({
      interval: 1000, // 每隔 1 秒触发一次
      triggerTime: 0, // 立即触发
      callback: () => {
        console.log('定时器触发了!');
      },
    });
  }

  // 停止定时器
  stopTimer() {
    if (this.myTimer) {
      this.myTimer.stop(); // 停止定时器
      this.myTimer.destroy(); // 销毁定时器
      this.myTimer = null; // 清空定时器对象
      console.log('定时器已停止并销毁');
    }
  }
}

你可能感兴趣的:(鸿蒙,ui)