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. 20135234mqy 实验四

    北京电子科技学院(BESTI) 实     验    报     告 课程:java程序设计 班级:1352  姓名:mqy  学号:20135234 成绩:            指导教师:娄嘉鹏  ...

  2. CentOS中Intel i350T4驱动安装

    2015.3.31 在linux*中直接按解决方法中安装i350驱动即可 *************************************************************** ...

  3. Alpha阶段项目Postmortem会议总结

    (一)设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要解决总是不知道在什么时间该做什么事情,或是老是忘记做一些事情的问题,通过添加事件 ...

  4. Monty Hall 问题与贝叶斯定理的理解

     三门问题(Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty H ...

  5. visual stdio2013软件安装及单元测试

    visual stdio2013软件安装及单元测试 一.visual stdio2013软件安装详解 今天,笔者为大家带来如何在Windows10下完美安装Visual Studio 2013专业版. ...

  6. C语言中以十六进制输出字符型变量会出现'ffffff"的问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...

  7. js数组遍历 千万不要使用for...in...

    昨天做个下拉框 扩充了一下数组的方法 Array.prototype.remove = function (val) { var index = this.indexOf(val); if (inde ...

  8. 简单复利计算java板

    一.要求: 1.客户说:帮我开发一个复利计算软件. 2如果按照单利计算,本息又是多少呢? 3.假如30年之后要筹措到300万元的养老金,平均的年回报率是3%,那么,现在必须投入的本金是多少呢? 4.利 ...

  9. LeetCode题解:(19) Remove Nth Node From End of List

    题目说明 Given a linked list, remove the nth node from the end of list and return its head. For example, ...

  10. [转帖]go 的goroutine 以及 channel 的简介.

    进程,线程的概念在操作系统的书上已经有详细的介绍.进程是内存资源管理和cpu调度的执行单元.为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间 ...