在Android中暂停并继续CountDownTimer

时间:2017-10-10 10:13:41

标签: android timer countdowntimer

我知道有很多线程都有相同的主题,但我不想使用一些我不理解的随机代码。

这是我在Android Studio中暂停和继续CountDownTimer的当前代码:

public void getReadyTimer(long time){
    time = 12000;
    progress=0;
    circularProgressBar.setProgress(0);
    //tvInfo.setText("Get Ready!");

    timer= new CountDownTimer(time, 1000) { 

        public void onTick(long millisUntilFinished) {
            milliLeft = millisUntilFinished;
            sec = ((millisUntilFinished-1000)/1000);
            tvTimer.setText(Long.toString(sec));
            //tvTimer.setText((millisUntilFinished-1000) / 1000 + ""); 
            progress++;
            int animationDuration = 1500; // 2500ms = 2,5s
            circularProgressBar.setProgressWithAnimation((int)progress*100/(11000/1000), animationDuration); 

            circularProgressBar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (t== 0) {
                        pauseTimer();
                        t =1 ;
                        tvInfo.setText(Integer.toString(t));
                    }else{
                        resumeTimer();
                        t = 0;
                        tvInfo.setText(Integer.toString(t));
                    }
                }
            });

        }

        private void pauseTimer(){
            timer.cancel();
        }

        private void resumeTimer(){
            Log.i("sec", Long.toString(sec));
            milliLeft = sec*1000;
            getReadyTimer(milliLeft);


        }

        public void onFinish() {
            if (circularProgressBar.getProgress() == 100) {
                startTimer();
            }
        }

    }.start();
}

然而它无法正常工作。问题是,Timer(暂停后)再次以值“time”开始而不是“millileft”应该是。我感谢各种帮助。

3 个答案:

答案 0 :(得分:0)

您正在将传递的参数milliLeft的值重新分配给12000。要解决此问题,您可以创建两种方法。一个接受参数而另一个没有。 e.g。

public void getReadyTimer() {
    this.getReaderTimer(12000L); // default value
}

public void getReadyTimer(long time) {}

在参数化方法中删除

的赋值

time = 12000;

答案 1 :(得分:0)

您不应该致电timer.cancel()暂停计时器。然后你可以调用timer.resume()再次启动它。没有必要使用这么“复杂”的逻辑。

看看这里: Android: timer start, pause, stop

答案 2 :(得分:0)

使用此功能,可以帮助您

全局变量

private CountDownTimer timer;
long time = 12000;

<强>定时器

private void startTimer(long timerStartFrom) {
    timer = new CountDownTimer(timerStartFrom, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            //updating the global variable
            time = millisUntilFinished;

        }

        @Override
        public void onFinish() {

        }
    }.start();
}

在初始(onCreate)

如何开始

使用

启动计时器

startTimer(time)因为时间有初始值// 12000

如何暂停

然后您可以使用timer

暂停/取消timer.cancel()

如何恢复

当您想要恢复时,只需通过调用startTimer(time)启动计时器,因为计时器具有更新的值。

它会做什么 它将在您停止计时器的前一次启​​动计时器

简单,快乐编码:)