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() {@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分析相关推荐
- 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通过代码设置铃声_第六十四回:Android中UI控件之SeekBar
各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...
- android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础
各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView.闲话休提,言归正转.让我们一起Talk Androi ...
- android 触摸监听重写_第六十四回:Android中UI控件之SeekBar
各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...
- 微信小程序手把手教你实现类似Android中ViewPager控件效果
微信小程序手把手教你实现类似Android中ViewPager控件效果 前言 需求分析 头部TAB 滑动的内容部分 最终版本 尾巴 前言 在做Android开发的时候,ViewPager是开发者使用频 ...
- android include 控件详解,Android开发中include控件用法分析
本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...
- listview控件Android,Android中ListView控件的简单使用
文章引自郭霖<第一行代码> ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕 使用LIstView控件 1 在布局文件中引入Li ...
- Asp.Net中验证控件简单分析
为了实现验证,.net提供了一个javascript脚本,当我们生成一个asp.net页面时,通过查看页面源代码的方式,会发现都调用了下面一个javascript文件: <script src= ...
最新文章
- IHttpHandler 在SharePoint中的应用
- ORACLE告警日志
- 3、编写一个prod()函数,可以接受一个list并利用reduce()求积
- php5.6.30环境报错Call to undefined function ImageCreate() 编译安装 gd库
- CMake 常用的预定义变量
- 【响应式编程的思维艺术】 (1)Rxjs专题学习计划
- sqlite读音_SQLite 数据类型
- 把JS和CSS合并到1个文件
- 我在阿里工作9年,今天我离职了
- version GLIBC_2.28 not found
- axacropdf 服务器pdf_C#显示PDF文件
- UE源码版本下载编译全流程
- 数学符号大全(量词符号、代数符号等)
- JPA 中@Enumerated
- Arduino 控制 DS1302 时钟芯片
- 用支付宝和微信都可以扫的聚合支付码其原理是什么?云收呗的原理也很简单,API搭建比较方便,云收呗是最大的黑天鹅
- HTML中svg的作用,html中的svg可以用来干什么
- yamlip 安装_SpringBoot中yaml配置对象
- Android手机信号
- 【压缩感知合集8】MP算法(算法实现、收敛讨论以及问题分析)
热门文章
- d soft php package,让程序飞起来之 Laravel OPcache Package
- mask rcnn 召回率_搜索推荐召回amp;amp;粗排相关性优化最新进展—2020
- python开发工具和框架安装器_Python基础框架和工具
- 简单的签到代码_【SAS小恩的代码段】02样本分布、两群体与组合差异性检定
- Linux下飞鸽传书项目设计书,Linux 下飞鸽传书设计实现
- linux列出组_如何列出Linux中的所有组?
- java关键字static_Java中的static关键字
- Python中的numpy.sum()
- arcore与unity_Android ARCore –与相机的距离
- YII2 save 和 insert 循环保存数据,出现间隔性丢失值 (这些值是共有相同的值) 解决: // 每次保存需要用 clone 不能使用直接用一个 实例化的model....