Как избавиться от CountDownTimer

У меня есть основной класс под названием «MainActivity», и я запускаю его несколько раз в своем приложении.

private static CountDownTimer timer;
private static final long startTime = 15 * 1000;
private static final long interval = 1 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    timer = new StageCountDownTimer(startTime, interval);

}

private class StageCountDownTimer extends CountDownTimer {
    public StageCountDownTimer(long startTime, long interval) {
        super(startTime, interval);
    }

    @Override
    public void onFinish() {
        //STARTTING NEW ACTIVITY 
    }

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

Иногда пользователю необходимо закрыть это действие до окончания обратного отсчета и снова вернуться к этому действию. И затем запускается новый отсчет, но старый выполняет код в onFinish(), когда заканчивается предыдущий отсчет. Все отлично работает, когда я запускаю этот код один раз. Как отменить/утилизировать/уничтожить этот таймер после выхода из активности? Я попробовал timer.cancel() и ничего не произошло.

РЕДАКТИРОВАТЬ

Я думаю, что решил свою проблему, установив таймер CountDownTimer как общедоступный, а в другом действии я просто использую MainActivity.timer.cancel()


person Jakub Pomykała    schedule 15.09.2013    source источник
comment
static CountDownTimer создает здесь утечку памяти.   -  person MaciejGórski    schedule 16.09.2013


Ответы (3)


Ты можешь использовать:

if (isFinishing()) {
    CountDownTimer.cancel();
}

поэтому, если активность заканчивается, таймер обратного отсчета отменяется. и в следующий раз, когда вы откроете активность, будет запущен новый таймер обратного отсчета.

person Ahmed Ekri    schedule 15.09.2013
comment
Если вы используете фрагмент, просто добавьте cancel() в onDetach() метод жизненного цикла. - person FabioR; 01.04.2020
comment
куда мне вставить этот код? - person beginner; 09.01.2021

В дополнение к timer.cancel() (который должен работать) вы можете сделать в своем таймере onFinish():

@Override
    public void onFinish() {
        if(!MainActivity.this.isFinishing()) {
             // Start new activity...
        }
    }
person Alexander Kulyakhtin    schedule 15.09.2013

Я думаю, что решил свою проблему, установив CountDownTimer timer как public, а в другом действии я просто использую MainActivity.timer.cancel()

person Jakub Pomykała    schedule 15.09.2013