CountDownTimer使用—倒计时器实现

安卓提供了一个倒计时的类CountDownTimer,这个类会在固定的时间间隔回调方法,在执行计时结束后回调方法,方便操作;
示例代码

//创建一个时长30秒的倒计时器,倒计时间隔1秒,参数1为计时总时长,参数2为计时间隔
CountDownTimer countDownTimer = new CountDownTimer(30000, 1000) {//方法会在1秒后回调,参数millisUntilFinished表示剩余时间的毫秒值public void onTick(long millisUntilFinished) {mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);}//计时器结束时执行的方法public void onFinish() {mTextField.setText("done!");}};//调用start方法开始计时
countDownTimer.start();//调用cancel方法取消计时器结束计时
countDownTimer.cancel();

上面是计时器类简单使用,该计时器类没有暂停的方法,只能取消计时。

如果按照上面的方法使用,可能会出现问题,出现跳秒的问题,且在最后一秒时,显示时间较长,还有不会显示0秒的问题

这个问题是什么原因呢,我打印了onTick方法返回的剩余秒数值

从log日志可以看出,实际计时器onTick方法调用了4次,我设置的时间间隔是1s,但onTick返回的值第一次是5000ms,第二次应该是4000ms,但实际情况是返回的是3998ms,这样我用剩余秒数做处理获取秒值时,就会成为3s,也就是跳了1s,而在最后1s时,虽然显示的剩余1s,而实际是剩余时间接近2s的,因为之前计秒的误差,导致最后一次本应是2000ms的,实际成了小于2000ms的值,计算的话是1s,也就导致了最后一秒感觉时间不止1s,直观感觉卡了(实际并没有卡),计时器代码执行的时间会导致计秒出现误差,因此要解决误差的问题就需要对时间ms值进行补偿,那补多少呢?10ms?其实这个误差的值不同的设备不同,每次开启计时器误差也不同,并且设置的倒计时时间越长,这个误差到最后累计的也就越多,经过考虑决定设置添加500ms来进行误差补偿,增加500ms值不会影响计秒计算的结果。

增加500ms后日志打印结果

这样解决了跳秒的问题,但是有会出现一个问题,显示上现在是没问题了,但是看具体的时间,日志从31秒750开始打印的,结束为35秒756,剩余的还有1495ms,但是不会去执行onTick方法了,而是执行完剩下的1495ms后去执行onFinish方法了,实际计时时间为5.5s左右,这样是不对的,应该在计秒到0秒时,才结束计秒,计秒时长应该保证是5秒,为了解决问题,在总时长里面再增加1000ms,在处理显示的秒数时,应减去1s,判断剩余的秒数,秒数为0时就结束计时,调用cancel方法,调用onFinish方法去执行计时结束的逻辑,代码如下:

CountDownTimer countDownTimer = new CountDownTimer(5000+1500, 1000) {@Overridepublic void onTick(long millisUntilFinished) {long remainderTime = millisUntilFinished / 1000 - 1;//判断为1秒时,结束计时mTvCountTime.setText("millisUntilFinished" + remainderTime);LogUtils.e(remainderTime + "");if (remainderTime == 0) {onFinish();cancel();}}@Overridepublic void onFinish() {mTvCountTime.setText("计时结束");}};

执行日志

执行效果

结果显示,日志打印了6条,开始时间为22秒937,结束时间为27秒943,这样就正常了,计秒数为5s,在剩余0s时,设置文本显示计时结束,这样的话倒计时就实现了,如果需要设置长时间计时,那就将上面代码中的5000改为你想设置的秒数值即可,

设置10秒倒计时日志

到此倒计时类实现倒计时完成。可以将这个类实现封装成工具类,方便以后调用,比如发送验证码时的倒计时,最后经过整理贴出实现倒计时的工具类,仅供参考抛砖引玉:

import android.annotation.SuppressLint;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.TextView;/*** @author wodx521* @date on 2018/8/15*/
public class CountDownTimerUtils {@SuppressLint("StaticFieldLeak")private static CountDownTimer timer;/*** 由于该倒计时类会存在不会显示0秒,且最后1秒实际是接近2秒的时间,因此处理时将剩余秒数多减了一秒* 在创建timer时,倒计时的秒数应该多加1秒,自动计时类计时时会产生毫秒值得误差,如果去整数的值* 在计算时可能会出现跳秒的情况(实际倒计时的秒数差的不大,就几十毫秒),为了给计秒做补偿,多加500毫秒* 保证误差同时也能保证计秒准确** @param second      需要设置的倒计时秒数* @param view        倒计时运行时需要设置文本变化的控件TextView或者Button* @param defaultText 计时结束后view上显示的内容*/public static void getTimer(int second, final View view, final String defaultText) {timer = new CountDownTimer(second * 1000 + 1500, 1000) {@SuppressLint("DefaultLocale")@Overridepublic void onTick(long millisUntilFinished) {long remainderTime = millisUntilFinished / 1000 - 1;//判断view是否是TextView,如果是就设置显示倒计时的文本(Button是TextView子类)//如果是TextView的话,设置显示倒计时同时设置view不可点击if (view instanceof TextView) {((TextView) view).setText(String.format("%ds", remainderTime));}if (remainderTime == 0) {//判断为1秒时,结束计时,并恢复view可以点击onFinish();cancel();}}@Overridepublic void onFinish() {view.setClickable(true);if (view instanceof TextView) {((TextView) view).setText(defaultText);}}};//开启计时器timer.start();//设置不能被点击view.setClickable(false);}/*** 取消计时器计时*/public static void cancelTimer() {if (timer != null) {timer.cancel();timer.onFinish();}}
}

倒计时器CountDownTimer使用相关推荐

  1. android如何暂停倒计时,在Android中暂停和恢复倒计时器和进度条?

    我正在制作一个简单的应用程序,它使用倒计时器,循环进度条和3个按钮启动,暂停和恢复 . 我想要做的是当特定活动开始时我按暂停它存储定时器的时间暂停并从那一点开始恢复 . 但问题是倒计时器没有停止,所以 ...

  2. 倒计时 时间校准android,android倒计时器时间

    我一直在使用 android倒计时器样本来创建某个日期的倒计时. Time TimerSet = new Time(); TimerSet.set(20, 8, 2012); //day month ...

  3. android 倒计时跳过,倒计时器跳过一些毫秒

    正如您可以看到最后一次呼叫onTick正在发生2秒钟,然后接下来的呼叫将近2秒钟后.倒计时器跳过一些毫秒 @Override public void onCreate(Bundle savedInst ...

  4. Android课程设计倒计时app,单片机课程设计-可调倒计时器.doc

    PAGE PAGE 2 课 程 设 计 设计名称 单片机可调倒计时器 全套设计加扣?3012250582 学年学期 2013 -2014学年第 二 学期 课程名称 单片机原理及应用 专业年级 电气11 ...

  5. python 倒计时_Excel制作竞答倒计时器

    微信号: Excel-Python 微信名: 实用办公编程技能 前几天,单位搞年庆,中间有一个环节是有奖竞答,当时会务组长让我来负责控制竞答计时,当时我就自己用Excel做了一个竞答倒计时器. 那么, ...

  6. js倒计时天时分秒php,JS制作分秒倒计时器

    这篇文章主要介绍了JavaScript分秒倒计时器实现方法,可实现按照毫秒倒计时的效果,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了JavaScript分秒倒计时器实现方法.分享给大家供 ...

  7. Android:一个线程玩转商品列表所有item的倒计时器,并对Adapter进行单控件刷新优化...

    所以这次我还是会跟大家讲一下关于商城的一个需求------商品的倒计时器. 或者有人会说,商品的一个倒计时很简单,但是我这次的需求是一个商品列表,每个商品都需要有一个自己的计时器.首先我们看看需求效果 ...

  8. 非常有用的并发控制-倒计时器CountDownLatc

    转载自 非常有用的并发控制-倒计时器CountDownLatch CountDownLatch见名思义,即倒计时器,是多线程并发控制中非常有用的工具类,它可以控制线程等待,直到倒计时器归0再继续执行. ...

  9. 单片机float数发给上位机_上位机倒计时器

    1. 设置窗口 在VS2019新建一个Windows窗体应用(.NET Framework)项目,新建之后出现一个可视化页面(From1.cs[设计])设置窗口. 在左侧的工具箱里面拉拽控件到操作面板 ...

最新文章

  1. 独家 | 菜鸟必备的循环神经网络指南(附链接)
  2. linux shell 基础 使用日志与心得
  3. 邮箱自动转发攻击邮件服务器
  4. 回调函数在replace方法中的应用
  5. 正则表达式中关于字符集的问题
  6. 并发-分布式锁质量保障总结
  7. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
  8. 同一个JDK,命令行运行,与JNI加载虚拟机,还是有差异
  9. SQLServer 删除表中重复数据(除ID不同的)
  10. Word图文混排之杂志封面排版教程
  11. 关于删除某文件需要TrustedInstaller权限的解决方法
  12. mpAndroidchart 坐标和图表距离_合二为一——在Excel中制作组合图表!
  13. Windows域内密码凭证获取 (゚益゚メ) 渗透测试
  14. 代码故障检测列表(持续更新)
  15. 基于注意力机制的超分辨率重建汇总
  16. vue项目对接pad端——混合开发总结
  17. 你只是想学好linux而已
  18. 如何用数据分析进行游戏道具的精准投放?
  19. C++ opencv计算图像的水平投影,并返回一幅图像
  20. 网络基础UDP实例(传一个long类型的值)

热门文章

  1. 由中序和后序(前序)序列求前序(后序)序列
  2. 3D MAX眼睛贴图制作过程
  3. iis 安装完ssl 证书谷歌浏览器还是提示不安全的解决方法
  4. numpy数组的拼接(扩维拼接和非扩维拼接)
  5. 没有大数据就没有智慧城市
  6. 支持U盘数据、误删文件、硬盘数据 、回收站数据恢复的软件
  7. 辉芒微IO单片机FT60F023-RB方案MCU开发
  8. SIwave仿真手册——软件基础(一)
  9. python中的换行与不换行
  10. windows7微软官方_Microsoft Windows 7 | 第1部分