如何多次循环倒数计时器

时间:2016-03-17 17:20:13

标签: java android timer

我有一个问题,多次重复倒数计时器,在我的情况下12次。我制作了两个倒计时器,一个用于倒计时,一个用于暂停,效果很好。问题是当暂停结束时我希望倒计时倒计时再次自动开始,直到12轮暂停结束。 我用于循环。有没有更好的方法?

以下是代码:当用户点击按钮倒计时开始时

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            long roundtime= Long.parseLong(String.valueOf(msg1))*1000;//user has picked roundtime
            Counting timer = new Counting(roundtime, 100);//class Counting extends CountdownTimer
            for(int i=0;i<12;i++){
                timer.start(); // It goes just ones!
            }




        }

倒数计时器:

         class Counting extends CountDownTimer {

             public Counting(long roundtime, long countDownInterval) {
                 super(roundtime, countDownInterval);
             }
             @Override
             public void onTick(long millisUntilFinished) {
                 textView.setText("" + String.format("%02d:%02d",
                         TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(
                                 TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
                         TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(
                                 TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));
             }
             @Override
             public void onFinish() {  // When roundtime is finished,start pause time!
                 int seconds = msg1 % 60;
                 int minutes = (msg1 / 60) % 60;
                 textView.setText(String.format("%02d : %02d", minutes, seconds));
                 long pause= Long.parseLong(String.valueOf(msg2))*1000; //user has picked pause time
                 Counting2 timer2 = new Counting2(pause, 100);
                 timer2.start();
             }
         }
        class Counting2 extends CountDownTimer {

            public Counting2(long pause, long countDownInterval) {
                super(pause, countDownInterval);
            }

            @Override
            public void onTick(long millisUntilFinished) {
                textView2.setText("" + String.format("%02d:%02d",
                        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(
                                TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
                        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(
                                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));
            }

            @Override
            public void onFinish() {
                int seconds = msg2 % 60;
                int minutes = (msg2 / 60) % 60;
                textView2.setText(String.format("%02d : %02d", minutes, seconds));
            }
        }

    });
}

2 个答案:

答案 0 :(得分:0)

首先,您希望它循环12次。 这不是问题,但是,当它只循环11次时,你会感谢我。

应该是

 for(int i=0;i<=12;i++){
            timer.start(); // It goes just ones!
        }

由于我不知道Counting2的实现,它似乎挂起了那里的启动功能。我不知道它是否被覆盖了。如果您使用类似的onFinish方法,则这是由于原始Counting timer上的递归回调所致。因此,它会在中间循环一段等待时间(它不会像结果那样快速地获得堆栈溢出)。

答案 1 :(得分:0)

尝试忙碌等待以完成上一个计时器,然后再次启动它,它将会执行12次。

for(int i=0;i<12;i++){
            while(!previousTimerActive);
            timer.start(); 
            previousTimerActive = true;
        }

Counting2的{​​{1}}中设置指标onFinish()。现在,您只需要看看您希望这个previousTimerActive = false;以什么方式成为“全局”(因此可以从您的活动和您的班级boolean previousTimerActive访问它)。您可以在SharedPreferences中获取并设置它,或者使用第{} {3}}之类的第三方工具将其值从一个发送到另一个。