Android中的倒计时实现
一、android.os包下提供了倒计时的抽象工具类:
public abstract class CountDownTimer {
/**
* Millis since epoch when alarm should stop.
*/
private final long mMillisInFuture;
/**
* The interval in millis that the user receives callbacks
*/
private final long mCountdownInterval;
private long mStopTimeInFuture;
/**
* boolean representing if the timer was cancelled
*/
private boolean mCancelled = false;
/**
* @param millisInFuture The number of millis in the future from the call
* to {@link #start()} until the countdown is done and {@link #onFinish()}
* is called.
* @param countDownInterval The interval along the way to receive
* {@link #onTick(long)} callbacks.
*/
public CountDownTimer(long millisInFuture, long countDownInterval) {
mMillisInFuture = millisInFuture;
mCountdownInterval = countDownInterval;
}
/**
* Cancel the countdown.
*/
public synchronized final void cancel() {
mCancelled = true;
mHandler.removeMessages(MSG);
}
/**
* Start the countdown.
*/
public synchronized final CountDownTimer start() {
mCancelled = false;
if (mMillisInFuture <= 0) {
onFinish();
return this;
}
mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
mHandler.sendMessage(mHandler.obtainMessage(MSG));
return this;
}
/**
* Callback fired on regular interval.
* @param millisUntilFinished The amount of time until finished.
*/
public abstract void onTick(long millisUntilFinished);
/**
* Callback fired when the time is up.
*/
public abstract void onFinish();
private static final int MSG = 1;
// handles counting down
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) {
// no tick, just delay until done
sendMessageDelayed(obtainMessage(MSG), millisLeft);
} else {
long lastTickStart = SystemClock.elapsedRealtime();
onTick(millisLeft);
// take into account user's onTick taking time to execute
long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
// special case: user's onTick took more than interval to
// complete, skip to next interval
while (delay < 0) delay += mCountdownInterval;
sendMessageDelayed(obtainMessage(MSG), delay);
}
}
}
};
}
二、一个Demo,用倒计时不断刷新剩余时间,倒计时结束后置button为可点击状态
private class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
/**
* 计时过程中触发
*/
@Override
public void onTick(long millisUntilFinished) {
if (mVerify != null) {
int second = (int) (millisUntilFinished / 1000); //计算出还剩多少秒
mVerify.setText(getString(R.string.main_control_panel_grab_count_down, second));
}
}
/**
* 计时完成时触发
*/
@Override
public void onFinish() {
isVerifing = false;
if (mVerify != null) {
mVerify.setEnabled(true);
mVerify.setText(R.string.register_verify);
}
}
}
三、注意: 1. 该种方式实现的倒计时考虑了每次onTick处理函数中耗费的时间。
2. 使用的是handler机制,因此默认是靠Ui线程处理处理onTick函数(onTick中很可能有更新Ui的操作)
3. 可以看出,”循环“也是靠handleMessage方法中再抛一个Message方式实现(插一句话,常见的循环可以通过)。
4. 还有一点值得注意的是,每次onTick时,传入的是剩余时间值。
5. handleMessage方法的实现细节:
分两种情况:
1) onTick()的处理时间小于一个mCountdownInterval,所以delay(delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime())时间后正好是下一个onTick()时刻。

2) onTick()的处理时间大于或等于一个mCountdownInterval,不妨假设大于2个mCountdownInterval,则经过while循环不断跳过onTick()过程中耽搁的mCountdownInterval后,直到delay大于0时,正好是"下一个"mCountdownInterval后的onTick()时刻。

Android中的倒计时实现的更多相关文章
- Android中实现倒计时
1.需求 弹出提示的dialog,实现倒计时,结束后关闭dialog 2.dialog界面布局 <?xml version="1.0" encoding="utf- ...
- Android开发案例 – 在AbsListView中使用倒计时
在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...
- Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面
上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的使用方法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友可以点击链接回去 ...
- Android中使用Handler以及CountDownTimer实现包括倒计时的闪屏页面
上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的用法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友能够点击链接回去看看 ...
- 浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时
今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许 ...
- android中倒计时控件CountDownTimer分析
android中倒计时控件CountDownTimer分析 1 示例代码 new CountDownTimer(10000, 1000) { public void onTick(long milli ...
- 拓展 Android 原生 CountDownTimer 倒计时
拓展 Android 原生 CountDownTimer 倒计时 [TOC] CountDownTimer 在系统的CountDownTimer上进行的修改,主要是拓展了功能,当然也保留了系统默认的模 ...
- Android中Handler使用浅析
1. Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎 ...
- Android中三种计时器Timer、CountDownTimer、handler.postDelayed的使用
在android开发中,我们常常需要用到计时器,倒计时多少秒后再执行相应的功能,下面我就分别来讲讲这三种常用的计时的方法. 一.CountDownTimer 该类是个抽象类,如果要使用这个类中的方法, ...
随机推荐
- Java NIO入门小例(短连接:客户端和服务器一问一答)
例子中有些写法参考自Netty4源码,建议在实际运用中采用Netty,而非原生的Java NIO(小心epoll空转). 1. 服务器端 public class NioServer { static ...
- Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp
Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...
- iOS笔记 基于MKNetworkKit的断点续传
http://iiiyu.com/2012/07/07/learning-ios-notes-eight/
- hdu2263Heavy Cargo
#include <iostream> #include <cstdio> #include <algorithm> #include <queue>/ ...
- Linux进程(作业)的查看和杀死 牛
http://www.cnblogs.com/geaozhang/p/6910151.html
- 【SQL Sever】安装过程
下载了sql sever,如下: 首先把iso解压,如下: 1.点击 2.打开页面后 3. 接下来直接下一步下一步 完成之后,需要重启计算机才能使用! 4. 重启之后,进入配置工具 将所有的端口号更改 ...
- C++多重继承二义性解决
1. 什么是多重继承的二义性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class A{ public: void f(); } class B{ pu ...
- OCP升级(3.7 ->3.9)
坑多,搞了好多次. 1./etc/ansible/hosts [OSEv3:children] masters nodes etcd nfs [OSEv3:vars] ansible_ssh_user ...
- JBoss入门
很多内容摘自 https://www.jianshu.com/p/4baaf549436b 1.安装目录 安装完Jboss后得目录结构 目录 功能 appclient/ 包含应用程序客户容器的配置细节 ...
- ubuntu 的runlevel设定
修改ubuntu的启动级别 runlevel ----------------------------------------------------------------------------- ...