【问题标题】:Pause/Resume CountDownTimer Android暂停/恢复 CountDownTimer Android
【发布时间】:2016-05-01 10:32:37
【问题描述】:

是否可以在 Android 中暂停 CountDownTimer?我一直在寻找好的解决方案,但我只是找到了一些我真的不喜欢的方法。只需将剩余时间保存在变量中并使用该值初始化一个新的 CountDownTimer 。

这种解决方案有效,但它们看起来不太好,因为我正在使用圆形进度条和 Textview 以及我的倒计时计时器。真的很难看这两个看起来不错的倒计时而不能真正“暂停”它。

这是我用 ProgressBar 和 TextView 初始化 CountDownTimer 的代码。

    public void initProgress() {
    if (mCountdownProgressBar == null)
        mCountdownProgressBar = (CircleProgressBar) findViewById(R.id.progressBar);

    mCountDownTime = 30000; //Insert your desire time in Milliseconds here
    mCountdownProgressBar.setMaxProgress((int)TimeUnit.MILLISECONDS.toSeconds(mCountDownTime));
    mCountDownTimer = new CustomCountDownTimer(mCountDownTime, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            Log.v("Log_tag", "Tick of Progress" + TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished));
            mCountdownProgressBar.setmProgress(TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished));
            mTimer.setText(Util.getTimeForTimer(millisUntilFinished, Util.TIME_FORMAT));
        }


        @Override
        public void onFinish() {
            mCountdownProgressBar.setmProgress(0);
            mTimer.setText(Util.getTimeForTimer(0, Util.TIME_FORMAT));
        }
    };
    mCountDownTimer.start();
}

使用此代码,您将能够与 CountDownTimer 一起设置 progressBar 和 TextView。为了能够很容易地暂停和恢复它,我将在下一个为 CountDownTimer 发布自定义类。

【问题讨论】:

    标签: android time timer progress-bar countdowntimer


    【解决方案1】:

    这是解决方案!

    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.util.Log;
    
    public abstract class CustomCountDownTimer {
    
        private final String TAG = "CustomCountDownTimer";
        /**
         * Millis since epoch when alarm should stop.
         */
    
        private final long mMillisInFuture;
        /**
         * The interval in millis that the user receives callbacks
         */
        private final long mCountdownInterval;
    
        /**
         * The time in millis when the timer was paused
         */
        private long mTimePaused;
    
        /**
         * The final time when the timer must to stop (actual hour + countdown in millis)
         */
        private long mStopTimeInFuture;
    
        /**
         * boolean representing if the timer was cancelled
         */
        private boolean mCancelled = false;
    
        /**
         * boolean representing if the timer is paused
         */
        private boolean mPause = 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 CustomCountDownTimer(long millisInFuture, long countDownInterval) {
            mMillisInFuture = millisInFuture;
            mCountdownInterval = countDownInterval;
        }
    
        /**
         * Cancel the countdown.
         */
        public synchronized final void cancel() {
            mCancelled = true;
            mHandler.removeMessages(MSG);
        }
    
        /**
         * Pause the countdown.
         */
        public synchronized final void pause() {
            cancel();
            //Save the time and hour to resume the timer correctly later.
            mTimePaused = SystemClock.elapsedRealtime();
            mPause = true;
        }
    
        /**
         * Resume the countdown.
         */
        public synchronized final void resume() {
            //Booleans back to false value
            mPause = false;
            mCancelled = false;
            //We set the time to a new one because the elapsedTime as change
            mStopTimeInFuture = mStopTimeInFuture + (SystemClock.elapsedRealtime() - mTimePaused);
            Log.d(TAG, "mStopTimeInFuture: " + mStopTimeInFuture);
            mHandler.sendMessage(mHandler.obtainMessage(MSG));
        }
    
        /**
         * Start the countdown.
         */
        public synchronized final CustomCountDownTimer start() {
            mCancelled = false;
            mPause = 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 (CustomCountDownTimer.this) {
                    if (mCancelled || mPause) {
                        return;
                    }
    
                    final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
                    Log.d(TAG, "millisLeft: " + millisLeft);
                    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);
                    }
                }
            }
        };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2016-10-10
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多