探秘鸿蒙 HarmonyOS NEXT:鸿蒙定时器,简单倒计时的场景应用

news/2025/6/19 17:09:00

在鸿蒙 ArkTS 开发中,定时器是实现动态效果和定时任务的重要工具。基于鸿蒙 API 12 及以上版本,ArkTS 提供了功能丰富的定时器 API,本文将带你全面了解定时器的使用方法。

一、定时器常用 API 介绍

ArkTS 中的定时器主要分为一次性定时器(setTimeout)和周期性定时器(setInterval),它们都位于全局命名空间中,使用非常方便。

1. setTimeout - 一次性定时器

typescript

setTimeout(handler: Function, delay: number, ...args: any[]): number
  • handler:定时器触发时执行的回调函数
  • delay:延迟时间(毫秒)
  • args:传递给回调函数的参数
  • 返回值:定时器 ID,用于取消定时器

2. setInterval - 周期性定时器

typescript

setInterval(handler: Function, delay: number, ...args: any[]): number

参数和返回值与 setTimeout 相同,区别在于 setInterval 会按指定间隔重复执行回调函数。

3. clearTimeout - 取消一次性定时器

typescript

clearTimeout(timeoutId: number): void
  • timeoutId:setTimeout 返回的定时器 ID

4. clearInterval - 取消周期性定时器

typescript

clearInterval(intervalId: number): void
  • intervalId:setInterval 返回的定时器 ID

二、定时器使用步骤

1. 创建定时器

typescript

// 创建一次性定时器,2秒后输出"Hello World"
const timeoutId = setTimeout(() => {console.log("Hello World");
}, 2000);// 创建周期性定时器,每秒输出当前时间
const intervalId = setInterval(() => {console.log(new Date().toLocaleTimeString());
}, 1000);

2. 传递参数

typescript

setTimeout((name: string, age: number) => {console.log(`My name is ${name}, I'm ${age} years old.`);
}, 1500, "Tom", 20);

3. 取消定时器

typescript

// 取消一次性定时器
clearTimeout(timeoutId);// 取消周期性定时器
clearInterval(intervalId);

三、代码实战与分析

下面通过几个实际案例来深入理解定时器的使用。

案例 1:简单倒计时功能

typescript

@Entry
@Component
struct CountdownTimer {@State count: number = 10;private timerId: number = -1;aboutToAppear() {// 启动倒计时this.timerId = setInterval(() => {if (this.count > 0) {this.count--;} else {clearInterval(this.timerId);}}, 1000);}aboutToDisappear() {// 组件销毁前取消定时器,避免内存泄漏clearInterval(this.timerId);}build() {Column() {Text(`倒计时: ${this.count}秒`).fontSize(30).fontWeight(FontWeight.Bold)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

代码分析

  • 使用 @State 装饰器实现数据绑定
  • 在 aboutToAppear 生命周期函数中启动定时器
  • 每秒更新一次 count 值,当 count 为 0 时取消定时器
  • 在 aboutToDisappear 生命周期函数中取消定时器,防止组件销毁后定时器仍在运行

案例 2:实现轮播图效果

typescript

@Entry
@Component
struct CarouselDemo {@State currentIndex: number = 0;private images: Array<string> = ['https://pic.photos/800/400?random=1','https://pic.photos/800/400?random=2','https://pic.photos/800/400?random=3','https://pic.photos/800/400?random=4'];private timerId: number = -1;aboutToAppear() {// 启动轮播定时器this.timerId = setInterval(() => {this.currentIndex = (this.currentIndex + 1) % this.images.length;}, 3000);}aboutToDisappear() {// 组件销毁前取消定时器clearInterval(this.timerId);}build() {Column() {// 轮播图片Image(this.images[this.currentIndex]).width('100%').height(200).objectFit(ImageFit.Cover)// 指示点Row() {ForEach(this.images, (_, index) => {Circle().width(index === this.currentIndex ? 12 : 8).height(index === this.currentIndex ? 12 : 8).fill(index === this.currentIndex ? '#FF4500' : '#CCCCCC').margin({ left: 5, right: 5 })})}.margin(10).justifyContent(FlexAlign.Center)}.width('100%').height('100%')}
}

代码分析

  • 使用数组存储轮播图片地址
  • 定时器每 3 秒更新一次 currentIndex,实现图片切换
  • 通过 ForEach 动态生成指示点,当前图片对应的指示点显示为橙色
  • 同样注意在组件销毁前取消定时器

四、注意事项

  1. 内存泄漏风险:如果组件销毁前未取消定时器,定时器会继续运行,可能导致内存泄漏。
  2. 性能考虑:过多或间隔过短的定时器会影响应用性能,特别是 setInterval,应谨慎使用。

掌握 ArkTS 中的定时器 API,能够帮助你实现各种动态交互效果,如自动刷新、动画过渡、数据轮询等功能。合理使用定时器,并注意避免常见陷阱,将使你的应用更加流畅和稳定。


https://dhexx.cn/news/show-5537760.html

相关文章

Android --- Handler的用法,子线程中怎么切线程进行更新UI

我们都知道耗时操作需要放到子线程去操作&#xff0c;那我们可以new一个Thread来进行耗时操作&#xff0c;但是更新UI需要在主线程&#xff0c;就涉及到线程之间的切换&#xff0c;该如何处理呢&#xff1f;如下&#xff1a; 你可以通过使用 Handler 与 Looper.getMainLooper()…

案例解读:交安与建安安全员 C 证在实践中的差异

为了更直观地了解交安安全员证和建安安全员 C 证的区别&#xff0c;咱们通过实际案例来一探究竟。​ 案例一&#xff1a;在一条山区高速公路建设项目中&#xff0c;小张持有交安安全员 C 证。施工过程中&#xff0c;遇到一段复杂的地质路段&#xff0c;需要进行深挖方作业。小…

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…

Android 中使用 OkHttp 创建多个 Client

在 Android 开发中&#xff0c;有时我们需要创建多个 OkHttpClient 实例来满足不同的网络请求需求。以下是创建和管理多个 OkHttpClient 的方法&#xff1a; 基本创建方式 // 创建默认的 OkHttpClient val defaultClient OkHttpClient()// 创建带有自定义配置的 Client val …

【完整源码】白泽题库系统:基于PyQt5的智能刷题与考试平台开发全解析

&#x1f3af; 【完整源码】白泽题库系统&#xff1a;基于PyQt5的智能刷题与考试平台开发全解析 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热…

​​CentOS 7.9​​ 上配置 ​​Fail2ban 自动封禁 IP​​ 的完整步骤,整合了多篇权威资料的最佳实践

&#x1f527; ​​一、安装 Fail2ban​​ ​​启用 EPEL 仓库​​ yum install epel-release -y ​​安装 Fail2ban​​ yum install fail2ban -y ​​启动并设置开机自启​​ systemctl start fail2ban systemctl enable fail2ban ⚠️ 注意&#xff1a;CentOS 7.9 默认 Py…

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…

麒麟系统集成开发环境Kylin-IDE初体验,菜鸟小白入门教程

一、安装Kylin-IDE 1、打开应用商店&#xff0c;转到“软件”->“开发”页面&#xff0c;找到“Kylin-IDE”&#xff0c;点下载。&#xff08;也可以在搜索栏搜索Kylin-IDE&#xff09; 2、等待Kylin-IDE下载并自动安装完成。 3、双击桌面的Kylin-IDE图标。 4、自动弹出“开…

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…

机房断电后 etcd 启动失败的排查与快速恢复实录

目录 机房断电后 etcd 启动失败的排查与快速恢复实录 背景与问题起因 报错分析 解决方案&#xff1a;删除 member 数据重新初始化 步骤 1&#xff1a;停止 etcd 容器或服务 步骤 2&#xff1a;删除 member 目录 步骤 3&#xff1a;重启 etcd 服务 附加提醒 总结与后续…