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

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


前言

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


一、CountDownTimer 是什么?

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

二、代码示例

1.使用

代码如下(示例):

kotlin 复制代码
    /**
     * @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毫秒就能解决,问题不大,所以上例代码我们是这样的

kotlin 复制代码
CountDownTimer(300 * 1000+300, 1000)

及时取消

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


总结

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

参考 CountDownTimer使用心得及总结

相关推荐
JabamiLight2 小时前
Lineageos 22.1(Android 15)Launcer打开Taskbar
android·android 15·taskbar·lineageos 22.1
IT猿手4 小时前
2025最新高维多目标优化:基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码
android·开发语言·算法·机器学习·matlab·无人机
AlexMercer10125 小时前
Java 入门第一课 InteliJ IDEA 的快捷操作
android·java·开发语言·ide·笔记·intellij-idea
五味香6 小时前
C语言学习,希尔排序
android·c语言·开发语言·数据结构·学习·算法·排序算法
pengyu7 小时前
系统化掌握Flutter开发之Stack:布局系统中的"瑞士军刀”
android·flutter·dart
自动化BUG制造器8 小时前
Android 图形渲染【2】ViewRootImpl 与 Choreographer
android
飞猿_SIR10 小时前
最新版本Exoplayer(MediaX)实现K歌原伴唱包括单音轨和双音轨
android·ffmpeg·音视频
练小杰12 小时前
【Mysql】我在广州学Mysql 系列——Mysql 性能优化
android·数据库·经验分享·sql·mysql·性能优化·性能
她似晚风般温柔78914 小时前
鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)
android·鸿蒙·纯血鸿蒙
ShawnRacine15 小时前
Flutter-Android编译报错与解决方案汇总
android·flutter