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() { @Override
public 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的消息

android中倒计时控件CountDownTimer分析的更多相关文章

  1. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

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

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

  3. Android中ExpandableListView控件基本使用

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

  4. android中RecyclerView控件实现点击事件

    RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...

  5. android中RecyclerView控件实现瀑布流布局

    本文是在之前文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml: <?xml version="1.0" en ...

  6. android中RecyclerView控件的列表项横向排列

    本文是在上一篇文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml:我这里是把新闻标题挪到了新闻图片的下面显示 <?xml vers ...

  7. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  8. Android中常用控件及属性

    在之前的博客为大家带来了很多关于Android和jsp的介绍,本篇将为大家带来,关于Andriod中常用控件及属性的使用方法,目的方便大家遗忘时,及时复习参考.好了废话不多讲,现在开始我们本篇内容的介 ...

  9. android自定义倒计时控件示例

    这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.co ...

随机推荐

  1. Daily Scrum3 11.5

    昨天的任务已经完成,但是大家分析后发现进度稍有些慢.今天各自都在调整进度,不再拖延别人的工作. 今日任务: 杨伊:做问卷调查,准备用户体验篇内容. 徐钧鸿:把Xueba中Utility 向闸瓦移植 张 ...

  2. Dailu Scrum (2015/10/27)

    在周日晚上PM已经为大家分配了部分的代码修改工作,今天晚上PM召集了被分配代码工作的3个DEV一起讨论要求修改的代码.在共同讨论的过程中确有发现以下代码的不规范之处,PM当即要求我们先要修改规范代码的 ...

  3. Alpha版本冲刺(七)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  4. 浅谈iOS内存管理机制

    iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...

  5. charles抓取移动端app数据

    pc端为mac 移动端为android pc端 1.下载charles并安装 安利一个超好的良心网站(好多好用的软件都可以在上面找到,并且免费): http://xclient.info/search ...

  6. js 对象的合并(3种方法)转载

    对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...

  7. 配置docker的私有仓库

    1:安装docker-registry包 yum install -y docker-distribution   2:启动docker-distribution,默认监听于TCP/5000端口 sy ...

  8. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...

  9. Laravel 5.1 中的异常处理器和HTTP异常处理 abort()

    原文  http://laravelacademy.org/post/1867.html 错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便 ...

  10. JavaWeb基础【1】—— Tomcat

    此笔记是学习黑马程序员JavaWeb系列视频的课堂笔记. 感谢黑马程序员. 一.Tomcat概述 Tomcat服务器由Apache提供,开源免费.由于Sun和其他公司参与到了Tomcat的开发中,所以 ...