Как я могу предотвратить получение исключения при отмене уже отмененного таймера (потому что иногда он уже отменен / завершен с ним)? - PullRequest
2 голосов
/ 24 июля 2011

Я пытался отменить Timer.schedule () при запуске нового. Потому что мне нужно 1 расписание сразу. Но я получаю это исключение

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Timer already cancelled.

Как вы видите, таймер уже отменен, как я могу предотвратить это? Я попробовал этот код, но он все еще не работает, проверьте пожалуйста:

Примечание: все в этом коде работает нормально, кроме 2-й строки

Public void startTimer(byte h, byte m) {
    timer.cancel();//cancel the Timer whenever I start a new one
    Date d = new Date();
    d.setHours(h);
    d.setMinutes(m);
    d.setSeconds(0);
    UserInterface.setAlarmTime(h, m);
    timer.schedule(new Alarm(), d);

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

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

Ответы [ 5 ]

2 голосов
/ 24 июля 2011
try
{
    timer.cancel();
}

catch (IllegalStateException e)
{
    // Log error
}
0 голосов
/ 24 июля 2011

Просто отмените таймер.Создайте новый и запланируйте его.

timer.cancel();
timer = new Timer();
Date d = ... // set the date
timer.schedule (new Alarm(d));

Тем не менее, имя вашего метода подразумевает нечто иное, чем то, что вы делаете, что на самом деле setSchedule.

0 голосов
/ 24 июля 2011

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

Если вы посмотрите на исходный код Timer.java, вот два интересных метода -

 public void cancel() {
    synchronized(queue) {
          thread.newTasksMayBeScheduled = false;
        queue.clear();
        queue.notify();  // In case queue was already empty.
      }
}

А потом метод sched -

 synchronized(queue) {
          if (!thread.newTasksMayBeScheduled)
              throw new IllegalStateException("Timer already cancelled.");

Вы должны изменить свой код, чтобы не использовать тот же объект Timer для отмены, а затем запланировать ... вместо этого создайте новый Timer.

http://www.docjar.com/html/api/java/util/Timer.java.html

0 голосов
/ 24 июля 2011

Это ожидается, потому что вы не можете вызвать schedule () в отмененном таймере.Если вы собираетесь отменить существующий таймер, вам нужно создать новый, прежде чем вы сможете запланировать другую задачу:

public void startTimer(byte h, byte m) {
    timer.cancel();
    timer = new Timer();
    // ...
0 голосов
/ 24 июля 2011

Или другая идея - иметь глобальную переменную, которая является логической.Таким образом, в первый раз, когда вы установили таймер, значение становится ИСТИНА

if wasTimerSetup
 {
   timer.cancel();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...