Как я могу прервать эту тревогу без исключения? - PullRequest
0 голосов
/ 22 июля 2011

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

Это код моего будильника:

        waiter = new Thread(new Runnable() {
        public void run() {
            while (Thread.currentThread() == waiter) {
                Calendar d = Calendar.getInstance();
                if (getAlarmHours() == d.get(Calendar.HOUR_OF_DAY)) {
                    if (getAlarmMinutes() == d.get(Calendar.MINUTE)) {
                        UserInterface
                        .setAlarmText("no alarms");
                        playSound.play();
                        isSoundPlaying = true;

                        break;

                    }

                }

            }
        }
    });

Я хочу повторно использовать будильникОпять же, любые предложения о том, где я могу пойти не так, будут оценены.Если я использую wait(), как я могу уведомить без получения исключений?

Ответы [ 3 ]

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

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

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

Рассмотрите возможность перемещения вашего кода из цикла while в некую форму таймера.

Некоторыми распространенными рекомендациями будут встраивание класса Timer в JVM или Quartz которая является сторонней библиотекой от Terracotta.

В качестве примера вашей проблемы с сигнализацией при использовании стандартных параметров JVM

Timer timer = new Timer();
//Start the alarm now, change the date object to your specific time
timer.schedule(new AlarmTimerTask(), new Date(System.currentTimeMillis()));

И ваш класс AlarmTimerTask будет

public class AlarmTimerTask extends TimerTask {
  public void run(){
     //Do something
  }
}

если в какой-то момент вы хотите удалить таймер (выключить его или приложение закрывается), вызовите timer.cancel(), чтобы удалить задачу.

Кварц предоставит вам дополнительную функциональность и хорошую библиотеку для изучения

Редактировать: я должен указать, что если вы назначите класс AlarmTimerTask для своей собственной переменной вместо инициализации его в методе schedule (), вы также можете вызывать метод cancel () для отдельной задачи, а не только для Timer

0 голосов
/ 22 июля 2011
waiter.interrupt();

также, внутри вашего цикла while, возможно, поместите Thread.sleep (100);

...