【问题标题】:Pause and Continue CountDownTimer in Android在 Android 中暂停和继续倒计时
【发布时间】:2017-10-10 10:13:41
【问题描述】:

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

这是我当前在 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();
}

但是它不能正常工作。问题是,计时器(暂停后)再次以“时间”值而不是“millileft”值重新启动。感谢您的各种帮助。

【问题讨论】:

    标签: android timer countdowntimer


    【解决方案1】:

    用这个,可能对你有帮助

    全局变量

    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();
    }
    

    In Initial(onCreate)

    如何开始

    开始你的计时器

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

    如何暂停

    然后你可以使用timer.cancel()暂停/取消timer

    如何恢复

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

    它会做什么 它会以您之前停止计时器的时间开始您的计时器

    简单,快乐编码:)

    【讨论】:

    • @Ketarr 你试试这个
    • 如何在函数外使用timer变量?它的作用域不是仅限于startTimer() 函数吗?
    【解决方案2】:

    您不应致电 timer.cancel() 来暂停计时器。之后您可以调用 timer.resume() 重新启动它。没必要用这么“复杂”的逻辑。

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

    【讨论】:

      【解决方案3】:

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

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

      在参数化方法中去掉赋值

      time = 12000;

      【讨论】:

      • 当我使用第一种方法时,如何将milliLeft分配给getReadyTimer()?
      • @Ketarr 您将使用第二种方法并将其称为getReadyTimer(milliLeft)
      • 嗯.. 它抛出:milliLeft 不能应用于(长)
      • @Ketarr 我忘记添加后缀L。使用this.getReaderTimer(12000L) 作为默认值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      相关资源
      最近更新 更多