用于计时器android studio中的循环

时间:2018-05-28 07:52:38

标签: android android-studio countdowntimer android-studio-3.0

我正在尝试创建一个在给定时间内运行x次的计时器。示例:10是计时器应运行的秒数。 3是10秒计时器应该完成的次数。

理想情况下,它会在第一次开始10秒(或任何可变时间)倒计时。 然后发出声音。 然后再次开始倒计时(第二次)。 然后发出声音。 然后再次开始倒计时(第三次)。 然后播放声音并停止执行并执行其他操作。

到目前为止,我已经创建了一个调用timer方法的for循环,但它似乎只运行了1x。谁能看到我做错了什么?

    private void startRound(){
    for ( int i = 0; i < mRounds; i++){
        startTimer();
    }
}

private void startTimer(){
        CountDownTimer = new CountDownTimer(mTimeLeft, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeft = millisUntilFinished;
                updateCountDownText();
            }

            @Override
            public void onFinish() {
                textView.setText("FINISHED");
                mTimerRunning = false;
                mButtonStartPause.setText("START");
                mButtonStartPause.setVisibility(View.INVISIBLE);
                ;
                mButtonReset.setVisibility(View.VISIBLE);
            }
        }.start();
        mTimerRunning = true;
        mButtonStartPause.setText("Pause");
        mButtonReset.setVisibility(View.INVISIBLE);
}

1 个答案:

答案 0 :(得分:0)

这是因为 for循环不等待 CountDownTimer 完成。并立即启动3个倒计时器〜 对于重复简单的周期性任务,建议在Android中使用Handler。 请参阅此link

Android中的CountDownTimer类本身在内部使用Handler。

您可以创建一个处理程序并将runnable传递给它。 像这样:

        int numberOfTimers = 3;
        int numberOfSeconds = 10;

        Handler timerHandler = new Handler();

    /**
     * Inner class that implements {@link Runnable} to check the timer updates.
     */
    class RunnableTimer implements Runnable {
        int numberOfSeconds;
        int secRemaining;
        int timesRemaining;

        RunnableTimer(int numberOfSeconds, int timesRemaining) {
            this.numberOfSeconds = numberOfSeconds;
            this.timesRemaining = timesRemaining;
            secRemaining = numberOfSeconds;
        }

        @Override
        public void run() {
            if(secRemaining>0){
                    --secRemaining; // decrease the remaining seconds by 1.
                    updateText() // upadate the textView with remaining seconds.
                    handler.postDelayed(this,1000); // repeat the runnable after 1 sec
                }else {
                    timesRemaining--; // decrease the number of timer by 1 when countdown finishes
                    updateTextWhenTimerFinished() // update the text when the countdown finishes
                    playSound(); // play the sound

                    // check if the timer has to run more times
                    if( timesRemaining > 0 ){
                        secRemaining = numberOfSeconds; // re-initialize the timer seconds
                        handler.postDelayed(this,1000); // repeat the runnable after 1 sec
                    }   
                }
        }

        RunnableTimer timerRunnable = new RunnableTimer(numberOfSeconds, numberOfTimers);

       //finally pass the runnable in the handler to start the timer
       timerHandler.post(timerRunnable);

不要忘记在活动的onStop()中调用timerHandler.removeCallbacks(timerRunnable)。