安卓 实现60s倒计时的CountDownTimer(小坑)

news/2025/3/16 6:21:01/

安卓 实现60s倒计时的CountDownTimer(小坑)

  • 前言
  • 一、CountDownTimer 是什么?
  • 二、代码示例
    • 1.使用
    • 2.小坑的点
      • 误差
      • 及时取消
  • 总结


在这里插入图片描述

前言

前段时间写倒计时没有用线程,想换一种实现方式结果踩了个小坑,特此记录。


一、CountDownTimer 是什么?

CountDownTimer 是 Android 系统提供的一个用于倒计时的类,主要用于实现倒计时功能,是 Android 开发中常用的一个类。通过 CountDownTimer,我们可以很方便地实现各种倒计时需求,比如验证码倒计时、秒杀倒计时、开奖倒计时等等。在 Android 开发中,CountDownTimer 可以说是一个非常常用的工具类,但是不得不说的是它也有一些坑。

二、代码示例

1.使用

代码如下(示例):

    /*** @time 2023/9/18 16:03* @Description: 验证码倒计时 */private fun initCountDownTimer() {mCountDownTimer = object : CountDownTimer(300 * 1000+300, 1000) {@SuppressLint("SetTextI18n")override fun onTick(p0: Long) {mBinding.tvSendCode.text = formatCountdown(p0)if (p0 <= 0) {onFinish()}}override fun onFinish() {mBinding.tvSendCode.text = resources.getString(R.string.ctv_send_code)}}}/*** 时间显示格式,大于60s时为xx分xx秒,小于等于60s时只显示xx秒*/fun formatCountdown(time: Long): String {var result = ""if (time > 60000) {result = "${(time / 60000).toInt()} m ${(time % 60000) / 1000} s"} else {result = "${(time / 1000).toInt()} s"}return result}

CountDownTimer有两个参数,单位都是毫秒

  • millisInFuture:倒计时的总时长
  • countDownInterval:每次的间隔时间

上例代码我们可以看到是从onTick中更新倒计时。

2.小坑的点

误差

CountDownTimer 会有一定的误差,如果是小的时间可以不用管太多,多加300毫秒就能解决,问题不大,所以上例代码我们是这样的

CountDownTimer(300 * 1000+300, 1000)

及时取消

如果我们开始了CountDownTimer ,然后中途退出了页面,需要调用CountDownTimer 的cancel方法取消倒计时,否则CountDownTimer 会继续执行,不仅有内存泄漏的风险,还会因为控件已经被回收而报错空指针。


总结

本文介绍了 Android 开发中常用的 CountDownTimer 类,用于实现倒计时功能,包括代码示例和小坑的点。需要注意的是,CountDownTimer 有一定的误差,需要注意及时取消,以避免内存泄漏和空指针问题。

参考 CountDownTimer使用心得及总结


http://www.ppmy.cn/news/1172903.html

相关文章

mysql图片存取初探

mysql数据库中使用blob存储使用base64加密图片数据 前言 这个方法并不好&#xff0c;因为传输的数据量还是蛮大的&#xff0c;可以存一些诸如头像的小图片&#xff0c;但是如果要存较大的图片会很慢。 不过只是课程作业中简单的功能&#xff0c;这样子简单又快捷&#xff0c;…

LabVIEW应用开发——控件的使用(三)

接上文&#xff0c;这篇介绍簇Cluster控件。 LabVIEW应用开发——控件的使用&#xff08;二&#xff09; 1、簇Cluster 1&#xff09;创建 蔟控件又称为组合、集群控件&#xff0c;顾名思义它是一个类似于C语言的结构体的一个数据结构控件。在描述一个对象的时候&#xff0c;…

全链路压测专题---3、全链路压测具体实现

流量染色 流量识别 要想压测的流量和数据不影响线上真实的生产数据&#xff0c;就需要线上的集群能识别出压测的流量&#xff0c;只要能识别出压测请求的流量&#xff0c;那么流量触发的读写操作就很好统一去做隔离了。 全链路压测发起的都是Http的请求&#xff0c;只需要要…

QTday06(人脸识别项目前置知识)

qt版本5.4.0&#xff1a;旧版本的qt&#xff0c;为啥要用旧版本的我也不知道 实现结果&#xff1a; 调用系统摄像头&#xff0c;用红框框住画面中的人头 代码&#xff1a; pro&#xff1a; #------------------------------------------------- # # Project created by QtC…

点云从入门到精通技术详解100篇-双目鱼眼系统的畸变校正及目标重建(续)

目录 3.3双目鱼眼系统标定 3.4基于光束平差法的标定结果优化 3.5标定实验结果与分析

vscode代码快捷输入

Vscode代码片段快捷输入 常用的代码片段为了避免重复输入,可以使用Vsco的中用户代码片段进行设置,这样就可以实现快捷输入. 操作流程 如下 打开vscode的设置 2. 找到用户代码片段 3. 选择模板 4. 然后写入代码片段即可 上面的代码片段可以设置多个,看自己 重点关注的是 prefi…

spacy.load(“en_core_web_trf“)报错TypeError: issubclass() arg 1 must be a class

使用spacy时遇到的问题 写在最前面&#xff1a; 安装spacy和en_core_web_trf时需要保证二者版本一致 安装及查看对应spacy版本 安装 pip install spacy查看版本 import spacy spacy.__version__安装en_core_web_trf 直接安装&#xff08;如果可以的话&#xff09; pytho…

Nacos 下载运行及配置

Nacos 服务注册与配置中心&#xff0c;兼顾两者 文章目录 Nacos 服务注册与配置中心&#xff0c;兼顾两者一、简介二、相关文档2.1 Nacos官网2.2 官方文档 三、下载并运行Nacos3.1 下载压缩包3.2 解压缩3.3 运行命令3.4 访问Nacos控制台 附录&#xff1a;各种注册中心比较 Naco…