如何在另一个 CountdownTimer 内的 android studio CountdownTimer 中重新启动(两者都运行良好)

How to restart in android studio CountdownTimer inside of another CountdownTimer(Both are working perfectly)

我正在尝试制作一个问题游戏来提高我的技能。用户选择游戏时间(在本例中假设为 10 分钟),对于每个问题,他们有 10 秒或任何时间来回答。两个计时器都工作正常,但是我如何在 10 秒计数器结束时重新启动它并在 10 分钟计数器结束之前让出下一个问题?

   private void startGameTimer(final TextView gameCountDown, final ArrayList<MusicSQLRow> arrayQuiz) {
// le agrego 2 segundos de delay para que le de tiempo al usuario de reaccionar


        new CountDownTimer(gameTime,1000){

            @Override
            public void onTick(long millisUntilFinished) {

            gameCountDown.setText("Time Remaining: "+String.format("%d min, %d sec",
                    TimeUnit.MILLISECONDS.toMinutes( millisUntilFinished),
                    TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));

                 // the questions begin adjusted by the SharedPreferences answer time, se abre otro thread para manejar la pregunta
                this.askQuestion(arrayQuiz);

            }

            // handles just one question
            private void askQuestion(ArrayList<MusicSQLRow> arrayQuiz) {

                new CountDownTimer(answerTime,1000){


                    @Override
                    public void onTick(long millisUntilFinished) {

                        answerCountDown.setText("Next Question in: "+ TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) );


                    }

                    @Override
                    public void onFinish() {

                    }
                }.start();


            }

            @Override
            public void onFinish() {
               //unhide buttons to go back to main menu or to play again(reset the activity, check if there's no problem with shared preferences when the activitie reloads)
            }

        }.start();

    }

首先:尽量不要创建长运行 CountDownTimer 的匿名实例,您将无法处理它们并且会泄漏整个activity。最好的选择是创建包含这些计时器的单独 class 文件。

CountDownTimer gameTimer, answerTimer;
boolean gameTimerIsRunning, answerTimerIsRunning;

public void startGame(){
    startGameTimer();
    startAnswerTimer();
}

public void startGameTimer(){
    gameTimer = new CountDownTimer(GAME_DURATION, TEXT_VIEW_UPDATE_RATE){

        @Override public void onTick(long millisUntilFinished) {
            updateGameTextView(millisUntilFinished);
        }

        @Override public void onFinish() {
            gameTimerIsRunning = false;
            if(answerTimerIsRunning) answerTimer.cancel(); 
            handleEndOfTheGame();
        }

    };
    gameTimerIsRunning = true;
    gameTimer.start();
}

public void startAnswerTimer(){
    if(answerTimer==null) {
        answerTimer = new CountDownTimer(TIME_FOR_AN_ANSWER, TEXT_VIEW_UPDATE_RATE) {

            @Override public void onTick(long millisUntilFinished) {
                updateAnswerTextView(millisUntilFinished);
            }

            @Override public void onFinish() {
                answerTimerIsRunning = false;

                if (gameTimerIsRunning) {
                    loadNewQuestion();
                    startAnswerTimer();
                }
        };
    }
    answerTimerIsRunning = true;
    answerTimer.start();
}

不要忘记在 activity/fragment onPause() 中调用 gameTimer.cancel() 和 answerTimer.cancel()。