Java / Android / Firebase и возможность остановки / перезапуска TimerTask в методе onDataChange - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь запустить, завершить и сбросить + перезапустить таймер, используя два разных оператора if в методе onDataChange. То, что я не могу заставить работать, это заставить таймер перезапуститься, если первый оператор if снова срабатывает после того, как второй остановит таймер. После объявления класса вверху у меня есть

    Timer firstTestTimer = new Timer();
    TimerTask increaseByTwo = new TimerTask() {
        @Override
        public void run() {
            incrementalCount = incrementalCount + 2;
            System.out.println(incrementalCount);
        }
    };

, а в методе onCreate у меня есть ссылка Firebase с ValueEventListener со следующим кодом:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String Motion1 = dataSnapshot.child("Enter").getValue().toString();
                if(Motion1.equals("YES")){
                    incrementalCount = 0;
                    firstTestTimer.schedule(increaseByTwo, 2000,2000);
                }
                if(Motion1.equals("STOP")){
                    firstTestTimer.cancel();
                    firstTestTimer.purge();
                    System.out.println("Total seconds elapsed since sensor showed YES: "+incrementalCount);
                    if(incrementalCount > 11){
                        System.out.println("The difference is greater than 11 seconds");
                    }
                }
            }

На данный момент, когда значение Firebase первоначально изменяется на «ДА», таймер запускается и каждые две секунды увеличивается incrementalCount на 2. Когда значение Firebase меняется на «STOP», таймер показывает правильное количество секунд, которое Прошло. Вот проблема: когда значение Firebase снова меняется на «ДА», приложение вылетает и дает мне некоторое изменение java.lang.IllegalStateException: Task already scheduled or cancelled Можно ли сбросить и перезапустить таймер со счетом fre sh всякий раз, когда значение Firebase изменяется на « ДА"? Спасибо!

1 Ответ

0 голосов
/ 02 апреля 2020

Как заметил @ ThomasKläger, вы не можете снова использовать TimerTask. Документы указывают, что:

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

Это похоже на пластиковую чашку или ложку c, созданную для использования только один раз. Поэтому каждый раз, когда вам нужно увеличить таймер, вот что вы можете сделать:

Оставьте таймер таким, какой он есть, и снова определите объект задачи таймера:

if (Motion1.equals("YES")){
    incrementalCount = 0;

    //Define it again, I think it is a waste of time to check whether the task exists or not.
    increaseByTwo = new TimerTask() {
        @Override
        public void run() {
            incrementalCount = incrementalCount + 2;
            System.out.println(incrementalCount);
        }
    };

    firstTestTimer.schedule(increaseByTwo, 2000,2000);
}

Остальной код та же. Это должно работать.

Документация для TimerTask находится здесь: TimerTask JDK 11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...