Android:Count Down Timer .cancel()不能正常工作

时间:2015-08-29 14:51:54

标签: android timer countdowntimer

我正在设计一款游戏,并且在倒计时器停止时会出现问题。计时器正常启动,应该在end()方法中停止。当ENEMY_HULL被检查为0或更小时,它运行良好,当用户按下按钮时会单独调用,并且调用checkEnemyDefeat(),但是当ENEMY_CREW为0时它不起作用。在这两种情况下,日志中的消息cat表示计时器停止出现,所以我的猜测是.cancel()被调用。我已经包含了所有相似的代码。

注意:包括CountDownTimer在内的所有变量都是全局变量

以下是包含计时器的方法:

this

接下来是crewFightCalculator方法:

private void BadGameLoop() { 
    if (GAME_PAUSED == true && !GAME_TIME_STARTED) {
        Log.d(" -------- ", "TIMER STARTED");
        GAME_PAUSED = false;
        GAME_TIME_STARTED = true;

        gameTimer = new CountDownTimer(GAME_TIME, UPDATE_RATE) {
            @Override
            public void onTick(long millisUntilFinished) {
                TICKS++;

                timer.setText(String.valueOf(GAME_TIME / 1000 - TICKS / 10));



                if((CREW_BOARDING > 0 || ENEMY_CREW_BOARDING > 0) && TICKS%10 == 0){
                    crewFightCalculator();
                }
                updateViews();
            }
            @Override
            public void onFinish() {

                TICKS=0;
                GAME_TIME_STARTED = false;
                GAME_PAUSED = true;
                end();
            }
        };gameTimer.start();
    }
}

checkEnemyDefeat和end方法:

private void crewFightCalculator(){
    // this just changes the values of ENEMY_CREW (global variable) and then
//calls checkEnemyDefeat() to verify if it should end the timer or not

    checkEnemyDefeat();
}

对我来说,为什么它不起作用,这简直太棒了。我唯一的猜测是它与.cancel()不是由用户输入启动的一系列函数触发这一事实有关。

1 个答案:

答案 0 :(得分:0)

我发现这个问题的唯一解决办法就是修改onTick方法,以便每次都应检查它是否应该运行或停止计时器,如下所示:

private void BadGameLoop() { 
if (GAME_PAUSED == true && !GAME_TIME_STARTED) {
    Log.d(" -------- ", "TIMER STARTED");
    GAME_PAUSED = false;
    GAME_TIME_STARTED = true;

    gameTimer = new CountDownTimer(GAME_TIME, UPDATE_RATE) {
        @Override
        public void onTick(long millisUntilFinished) {
        if(GAME_TIME_STARTED) {
            TICKS++;

            timer.setText(String.valueOf(GAME_TIME / 1000 - TICKS / 10));



            if((CREW_BOARDING > 0 || ENEMY_CREW_BOARDING > 0) && TICKS%10 == 0){
                crewFightCalculator();
            }
            updateViews();

        }else{
            gameTimer.cancel();
        }}
        @Override
        public void onFinish() {

            TICKS=0;
            GAME_TIME_STARTED = false;
            GAME_PAUSED = true;
            end();
        }
    };gameTimer.start();
}
}

尽管如此,我还是无法弄清楚为什么它之前没有正常工作。