安卓 实现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使用心得及总结

相关推荐
林北北的霸霸1 小时前
django初识与安装
android·mysql·adb
Java 码农2 小时前
MySQL EXPLAIN 详解与优化指南
android·mysql·adb
stevenzqzq7 小时前
Android Hilt 入门教程_传统写法和Hilt写法的比较
android
wuwu_q7 小时前
用通俗易懂方式,详细讲讲 Kotlin Flow 中的 map 操作符
android·开发语言·kotlin
_李小白8 小时前
【Android FrameWork】第五天:init加载RC文件
android
2501_916007478 小时前
手机使用过的痕迹能查到吗?完整查询指南与步骤
android·ios·智能手机·小程序·uni-app·iphone·webview
黄毛火烧雪下9 小时前
React Native (RN)项目在web、Android和IOS上运行
android·前端·react native
下位子9 小时前
『OpenGL学习滤镜相机』- Day7: FBO(帧缓冲对象)
android·opengl
從南走到北9 小时前
JAVA国际版同城外卖跑腿团购到店跑腿多合一APP系统源码支持Android+IOS+H5
android·java·ios·微信小程序·小程序
空白格979 小时前
组件化攻略
android