android中倒计时控件CountDownTimer分析
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分析的更多相关文章
- Android中ListView控件的使用
Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...
- android中ListView控件&&onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
- Android中ExpandableListView控件基本使用
本文採用一个Demo来展示Android中ExpandableListView控件的使用,如怎样在组/子ListView中绑定数据源.直接上代码例如以下: 程序结构图: layout文件夹下的 mai ...
- android中RecyclerView控件实现点击事件
RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...
- android中RecyclerView控件实现瀑布流布局
本文是在之前文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml: <?xml version="1.0" en ...
- android中RecyclerView控件的列表项横向排列
本文是在上一篇文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml:我这里是把新闻标题挪到了新闻图片的下面显示 <?xml vers ...
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- Android中常用控件及属性
在之前的博客为大家带来了很多关于Android和jsp的介绍,本篇将为大家带来,关于Andriod中常用控件及属性的使用方法,目的方便大家遗忘时,及时复习参考.好了废话不多讲,现在开始我们本篇内容的介 ...
- android自定义倒计时控件示例
这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.co ...
随机推荐
- 小组冲刺第十一天站立会议(发布Alpha版+网站链接)
注: “助成”招聘网站链接:http://58.87.74.131:8080/zhucheng 欢迎大家进行评测. 一.任务看板: 二.燃尽图: 三.团队成员合照: 四.任务总结: 今天我们发布网站B ...
- 关于 error C2001: 常量中有换行符
看过之后,还是有所收获的,先mark一下 原链接: http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html#commentfo ...
- 软件共享平台的NABCD
Need: 我感觉我们这个软件很适合现在的大学生,特别是大一大二的学生,由于在大学里面学生都在各忙各的,学生遇到问题如果自己在网上查找,这就需要花费大量的时间,如果有了这个软件学生和老师都可以在这个平 ...
- 每天学一点easyui②
Form插件 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...
- 2018软工实践—Beta冲刺(1)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 调试服务器性能 展示GitHub当日代码/文档签入记录(组内 ...
- DPDK flow_filtering 源码阅读
代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...
- java集合LinkedList
基于jdk_1.8.0 关于List,主要是有序的可重复的数据结构.jdk主要实现类有ArrayList(底层使用数组).LinkedList(底层使用双向链表) LinkedList: (一)继承关 ...
- display:flex 布局教程,弹性布局!
display:flex 布局教程 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. ...
- API的HTTP Status Code
响应中的状态码 状态码 定义 说明 1xx 信息 接收到请求,继续处理 2xx 成功 操作成功地收到请求,理解和接受 3xx 重定向 为了完成请求,必须采取进一步擦措施 4xx 客户端错误 请求的语法 ...
- PHP中的PEAR是什么?
PEAR也就是为PHP扩展与应用库(PHP Extension and Application Repository),它是一个PHP扩展及应用的一个代码仓库. 补充:php中扩展pecl与pear ...