2012-07-04 4 views
1

Я делаю приложение для Android (считыватель QR-кода), и мне нужно сделать несколько действий 4 раза в секунду. Для этой цели я решил использовать Timer. Я обнаружил странное поведение этого:Android - Timer class

timer = new Timer(); 
timer.scheduleAtFixedRate(onTimer, 100, stn.GetStep()); 
timer.cancel(); 
timer = new Timer(); 
timer.scheduleAtFixedRate(onTimer, 100, stn.GetStep()); 

Последняя строка выдает ошибку - java.lang.IllegalStateException: TimerTask is scheduled already. Разве это не странно?

+0

Я решил. Я написал «getTimerTask()» вместо «onTimer». getTimerTask возвращает новый TimerTask. –

ответ

3

Нет, вот как это должно работать. A TimerTask - одноразовый объект. Создайте новый TimerTask, если вы хотите еще раз запланировать код. (См. В documentation)

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

Runnable toRunRepeatedly = new Runnable() { 
    public void run() { 
     // your code goes here... 
    } 
}; 

, а затем сделать

TimerTask tt = new TimerTask() { 
    public void run() { 
     // Delegate to the same runnable each time. 
     toRunRepeatedly.run(); 
    } 
}; 

Похожие вопросы:

+0

Я думал, что «новый таймер()» создает новый поток, который не имеет ничего общего с другими предыдущими экземплярами Timer (и потоками). –

+0

О, я вижу, TimerTask не похож на метод, это экземпляр, который можно запускать только один раз ... –

+0

Exacly. Ты понял. – aioobe

0

КРАТКОЕ ОТВЕТ: Нет, это не странно.

Это поток, и он будет находиться в состоянии «отмены», но из-за быстрого выполнения операторов поток не будет отменен. Так что это не очень странно, добро пожаловать на резьбу 101.

Почему вы отменяете поток для повторного вызова? Какая цель это служит? Вы не даете первому времени, чтобы безопасно остановиться, прежде чем вы его снова вызовете. Вы можете захотеть установить для объекта таймера значение null до его повторного создания.