美文网首页
Android CountDownTimer类最后一秒不回调

Android CountDownTimer类最后一秒不回调

作者: 看着我别说话 | 来源:发表于2018-12-12 14:41 被阅读0次

    做验证码倒计时的时候,用系统的CountDownTimer类,发现最后一秒收不到回调,这里去掉了源码里不回调的逻辑,亲测可用。

    public abstract class MyCountDownTimer {
        
        /**
         * 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 MyCountDownTimer(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 MyCountDownTimer 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
        @SuppressLint("HandlerLeak")
        private Handler mHandler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
    
                synchronized (MyCountDownTimer.this) {
                    if (mCancelled) {
                        return;
                    }
                    final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
                    Log.d("MyCountDownTimer", "millisLeft = " + millisLeft);
                    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);
                    }
                }
            }
        };
    }
    

    相关文章

      网友评论

          本文标题:Android CountDownTimer类最后一秒不回调

          本文链接:https://www.haomeiwen.com/subject/tzauhqtx.html