android中倒计时控件CountDownTimer分析1 示例代码
new CountDownTimer(10000, 1000) {public void onTick(long millisUntilFinished) {LogUtil.i(TAG, "seconds remaining: " + millisUntilFinished / 1000);}public void onFinish() {LogUtil.i(TAG, "done!");}
}.start();2 API解析CountDownTimer (long millisInFuture, long countDownInterval)
millisInFuture: 你要倒计时的总时间, 单位ms.
countDownInterval: 你要倒计时的间隔时间, 单位ms.public final void cancel () //取消当前的任务public abstract void onFinish () //当前任务完成的时候回调public abstract void onTick (long millisUntilFinished) //当前任务每完成一次倒计时间隔时间时回调public final CountDownTimer start () //开始当前的任务3 源码分析
public abstract class CountDownTimer {private final long mMillisInFuture; //倒计时的总时间private final long mCountdownInterval; //倒计时的间隔时间private long mStopTimeInFuture;private boolean mCancelled = false; //是否取消计时任务//构造方法public CountDownTimer(long millisInFuture, long countDownInterval) {mMillisInFuture = millisInFuture;mCountdownInterval = countDownInterval;}//取消倒计时public synchronized final void cancel() {mCancelled = true;mHandler.removeMessages(MSG);}//开始倒计时public synchronized final CountDownTimer start() {mCancelled = false;if (mMillisInFuture <= 0) {onFinish();return this;}mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;mHandler.sendMessage(mHandler.obtainMessage(MSG));return this;}//定期会回调的方法public abstract void onTick(long millisUntilFinished);//计时结束的回调方法public abstract void onFinish();private static final int MSG = 1;//CountDownTimer采用的是handler机制,通过sendMessageDelayed延迟发送一条message到主线程的looper中,//然后在自身中收到之后判断剩余时间,并发出相关回调,然后再次发出message的方式。//取消倒计时,把任务从对MessageQueue中移除就好了。private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {synchronized (CountDownTimer.this) {if (mCancelled) {return;}final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime(); //剩余时间if (millisLeft <= 0) {onFinish();} else if (millisLeft < mCountdownInterval) {sendMessageDelayed(obtainMessage(MSG), millisLeft);} else {long lastTickStart = SystemClock.elapsedRealtime();onTick(millisLeft);long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();while (delay < 0) delay += mCountdownInterval;sendMessageDelayed(obtainMessage(MSG), delay);}}}};
}4 几点注意
1 elapsedRealtime currentTimeMillis()区别
System.currentTimeMillis()获取的是系统时间,是距离1970年1月1日开始计算的一个值;
android.os.SystemClock.elapsedRealtime()获取从设备boot后经历的时间值。
System.currentTimeMillis()获取当前日期有意义,如当前是xxxx年xx月xx时xx分xx秒xxx毫秒,这个值在系统设置中可以更改的;
而SystemClock.elapsedRealtime()计算某个时间经历了多长时间有意义,例如通话经历了多长时间,这个值是系统设置无关。
但是Android源码中计算通话时间是用System.currentTimeMillis()的,这个一般情况下是没有问题的。
但是如果有人在设备建立通话后修改系统时间,那么通话结束后的时间值就不对了,日期往后调整个几年,通话时间就会显示有几年的2 sendMessageDelayed()
boolean sendEmptyMessageDelayed (int what,  long delayMillis)
在特定的时间delayMillis流逝后 发送一个仅包含有what的消息

转载于:https://www.cnblogs.com/huanyi0723/p/7805142.html

android中倒计时控件CountDownTimer分析相关推荐

  1. android中ListView控件onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  2. Android中ExpandableListView控件基本使用

    本文採用一个Demo来展示Android中ExpandableListView控件的使用,如怎样在组/子ListView中绑定数据源.直接上代码例如以下: 程序结构图: layout文件夹下的 mai ...

  3. android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...

  4. android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView.闲话休提,言归正转.让我们一起Talk Androi ...

  5. android 触摸监听重写_第六十四回:Android中UI控件之SeekBar

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...

  6. 微信小程序手把手教你实现类似Android中ViewPager控件效果

    微信小程序手把手教你实现类似Android中ViewPager控件效果 前言 需求分析 头部TAB 滑动的内容部分 最终版本 尾巴 前言 在做Android开发的时候,ViewPager是开发者使用频 ...

  7. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  8. listview控件Android,Android中ListView控件的简单使用

    文章引自郭霖<第一行代码> ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕 使用LIstView控件 1 在布局文件中引入Li ...

  9. Asp.Net中验证控件简单分析

    为了实现验证,.net提供了一个javascript脚本,当我们生成一个asp.net页面时,通过查看页面源代码的方式,会发现都调用了下面一个javascript文件: <script src= ...

最新文章

  1. IHttpHandler 在SharePoint中的应用
  2. ORACLE告警日志
  3. 3、编写一个prod()函数,可以接受一个list并利用reduce()求积
  4. php5.6.30环境报错Call to undefined function ImageCreate() 编译安装 gd库
  5. CMake 常用的预定义变量
  6. 【响应式编程的思维艺术】 (1)Rxjs专题学习计划
  7. sqlite读音_SQLite 数据类型
  8. 把JS和CSS合并到1个文件
  9. 我在阿里工作9年,今天我离职了
  10. version GLIBC_2.28 not found
  11. axacropdf 服务器pdf_C#显示PDF文件
  12. UE源码版本下载编译全流程
  13. 数学符号大全(量词符号、代数符号等)
  14. JPA 中@Enumerated
  15. Arduino 控制 DS1302 时钟芯片
  16. 用支付宝和微信都可以扫的聚合支付码其原理是什么?云收呗的原理也很简单,API搭建比较方便,云收呗是最大的黑天鹅
  17. HTML中svg的作用,html中的svg可以用来干什么
  18. yamlip 安装_SpringBoot中yaml配置对象
  19. Android手机信号
  20. 【压缩感知合集8】MP算法(算法实现、收敛讨论以及问题分析)

热门文章

  1. d soft php package,让程序飞起来之 Laravel OPcache Package
  2. mask rcnn 召回率_搜索推荐召回amp;amp;粗排相关性优化最新进展—2020
  3. python开发工具和框架安装器_Python基础框架和工具
  4. 简单的签到代码_【SAS小恩的代码段】02样本分布、两群体与组合差异性检定
  5. Linux下飞鸽传书项目设计书,Linux 下飞鸽传书设计实现
  6. linux列出组_如何列出Linux中的所有组?
  7. java关键字static_Java中的static关键字
  8. Python中的numpy.sum()
  9. arcore与unity_Android ARCore –与相机的距离
  10. YII2 save 和 insert 循环保存数据,出现间隔性丢失值 (这些值是共有相同的值) 解决: // 每次保存需要用 clone 不能使用直接用一个 实例化的model....