CountDownTimer 原理,倒计时实现

想实现一个倒计时功能,使用CountDownTimer非常简单,费话不多说

1:首先继承CountDownTimer,复写构造函数,onFinish和onTick方法,

onFinish方法在倒计时完成时调用;

onTick方法在经过一个时间间隔后调用一次,这里你可以写一些UI变化如还有几秒

	class TimeCount extends CountDownTimer {
		public TimeCount(long millisInFuture, long countDownInterval) {
			super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔
		}

		@Override
		public void onFinish() {// 计时完毕时触发
			send.setClickable(true);
		}

		@Override
		public void onTick(long millisUntilFinished) {// 计时过程显示
			send.setClickable(false);
			send.setText(millisUntilFinished / 1000 + "秒");
		}
	}
2 :使用,如下,就这么简单  

TimeCount timeCount=new TimeCount(60000,1000);
timeCount.start();

3:原理,看源码

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;


    /**
     * @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 final void cancel() {
        mHandler.removeMessages(MSG);
    }


    /**
     * Start the countdown.
     */
    public synchronized final CountDownTimer start() {
        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) {
                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这里要计算onTick所使用的时间,即当前开机总时长-onTick前开机总时长 
                    //即SystemClock.elapsedRealtime()-lastTickStart ;


                    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;
<span style="white-space:pre">		</span>           //就这么简单,只是用的sendMessageDelayed来倒计时
                    sendMessageDelayed(obtainMessage(MSG), delay);
                }
            }
        }
    };
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值