Daniel D.
Daniel D.

Reputation: 15

Android: Count Down Timer .cancel() not working

I'm designing a game and have a problem with countdowntimer not stopping. The timer starts normally as it should, and should stop in the end() method. It works well when ENEMY_HULL is checked as 0 or less, which is calulated seperatly when the users presses a button, and checkEnemyDefeat() is called, but it does not work when ENEMY_CREW is 0. On both situations the message in log cat that the timer is stopped appears, so my guess is that .cancel() is called. I've included all code that seems relevant.

NOTE: All variables including CountDownTimer are global variables

Here is the method containing the timer:

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

Next is the crewFightCalculator method:

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

The checkEnemyDefeat and end methods:

private void checkEnemyDefeat(){
    if(ENEMY_HULL <= 0){  
        updateViews(); 

        end();   
    }else if ( ENEMY_CREW < 1){
        updateViews(); 

        end(); 
    }
}
private void end(){ 
    if(GAME_TIME_STARTED){
        GAME_TIME_STARTED = false;
        gameTimer.cancel();
        Log.d("---------"," TIMER STOPPED !");
    }
    // do more stuff
}

It is simply bizzare to me why it dosen't work. My only guess is that it has something to do with the fact that .cancel() is not triggered by a chain of functions started by user input .

Upvotes: 0

Views: 1527

Answers (1)

Daniel D.
Daniel D.

Reputation: 15

The only solution to this problem that I found, was to modify the onTick method, so that it should check every time if it should run or stop the timer like this:

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

Still, i can't figure out why it didn't work properly before.

Upvotes: 0

Related Questions