作用

轻量级的 Android 定时/倒计时工具。

使用方法

  • start()
    开始倒计时

  • stop()
    停止倒计时

  • pause()
    暂停倒计时

  • restart()
    继续暂停的倒计时

  • onTick()
    倒计时间隔回调

  • onFinish()
    倒计时结束回调

  • CustomCountDownTimer(long millisInFuture, long countDownInterval)
    构造方法,其中参数的含义:
    millisInFuture: 总时长
    countDownInterval: 间隔时长

例如,CustomCountDownTimer(10000, 1000) 表示从现在开始倒计时,10秒后结束,每秒触发一次 onTick 事件。注意:onTick 事件在每秒的开始时刻调用,即 “onTick - 1秒“ – “onTick - 1秒“……如此重复10次。

源码

import android.os.Handler;import android.os.Message;import android.os.SystemClock;/** * 使用 android.os.CountDownTimer 的源码 * 1. 对回调 onTick 做了细小调整,已解决最后1秒不会倒计时到0,要等待2秒才回调 onFinish * 2. 添加了一些自定义方法 * Created by iWgang on 15/10/18. * https://github.com/iwgang/CountdownView */public abstract class CustomCountDownTimer {    private static final long ONE_SECOND_MILLS = 1000L;    private static final long CORRECT_OFFSET = 15L;    private static final int MSG = 1;    private final long mMillisInFuture;    private final long mCountdownInterval;    private long mStopTimeInFuture;    private long mPauseTimeInFuture;    private boolean isStop = false;    private boolean isPause = false;    /**     * @param millisInFuture    总倒计时时间     * @param countDownInterval 倒计时间隔时间     */    public CustomCountDownTimer(long millisInFuture, long countDownInterval) {        // 解决秒数有时会一开始就减去了2秒问题(如10秒总数的,刚开始就8999,然后没有不会显示9秒,直接到8秒)        if (countDownInterval > ONE_SECOND_MILLS) {            millisInFuture += CORRECT_OFFSET;        }        mMillisInFuture = millisInFuture;        mCountdownInterval = countDownInterval;    }    private synchronized CustomCountDownTimer start(long millisInFuture) {        isStop = false;        if (millisInFuture <= 0) {            onFinish();            return this;        }        mStopTimeInFuture = SystemClock.elapsedRealtime() + millisInFuture;        mHandler.sendMessage(mHandler.obtainMessage(MSG));        return this;    }    /**     * 开始倒计时     */    public synchronized final void start() {        start(mMillisInFuture);    }    /**     * 停止倒计时     */    public synchronized final void stop() {        isStop = true;        mHandler.removeMessages(MSG);    }    /**     * 暂时倒计时     * 调用{@link #restart()}方法重新开始     */    public synchronized final void pause() {        if (isStop) return;        isPause = true;        mPauseTimeInFuture = mStopTimeInFuture - SystemClock.elapsedRealtime();        mHandler.removeMessages(MSG);    }    /**     * 重新开始     */    public synchronized final void restart() {        if (isStop || !isPause) return;        isPause = false;        start(mPauseTimeInFuture);    }    /**     * 倒计时间隔回调     *     * @param millisUntilFinished 剩余毫秒数     */    public abstract void onTick(long millisUntilFinished);    /**     * 倒计时结束回调     */    public abstract void onFinish();    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            synchronized (CustomCountDownTimer.this) {                if (isStop || isPause) {                    return;                }                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();                if (millisLeft <= 0) {                    onFinish();                }                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);                }            }        }    };}

更多相关文章

  1. Android(安卓)Parcelable 源码解析
  2. eclipse上Android(安卓)NDK开发环境搭建
  3. Android(安卓)属性动画 源码解析 深入了解其内部实现
  4. Android(安卓)10 创建文件失败
  5. Android(安卓)自定义 Adapter
  6. Android(安卓)属性动画 源码解析 深入了解其内部实现
  7. Android网易有道词典案例源码分享
  8. 转:Android实现矩形设置菜单
  9. Android(安卓)volley的源码实现原理

随机推荐

  1. 专家专栏:Android层次化安全架构及核心组
  2. Android之系统自带的文字外观设置及实际
  3. android 牛人必修 ant 编译android工程
  4. 【转】Android(安卓)xml资源文件中@、@an
  5. 《Android/OPhone开发完全讲义》连载(4):And
  6. Android(安卓)的消息队列模型
  7. Android(安卓)Studio更新升级方法
  8. [转]Android的应用程序结构分析:HelloActi
  9. Android(安卓)网络协议
  10. Android画图之Matrix(二)