Таймер перезапуска в java
Я хотел бы сделать таймер, он будет перезапущен, когда что-то случится:
public static Timer timer;
public myTimer(long MAC, String ipAddress){
timer = new Timer();
timer.schedule(timerTask, 120000);
}
public void update(){
timer.cancel();
timer = new Timer();
timer.schedule(timerTask, 120000);
}
У меня проблема при создании нового расписания, у меня есть эта ошибка:
java.lang.IllegalStateException: Task already scheduled or cancelled
at java.util.Timer.sched(Timer.java:358)
at java.util.Timer.schedule(Timer.java:170)
at spb.keepAliveTimer.update(keepAliveTimer.java:37)
at spb.keepAlive.update(keepAlive.java:58)
at spb.receptor.keepAlive(receptor.java:475)
at spb.receptor.run(receptor.java:118)
at java.lang.Thread.run(Thread.java:662)
Я не знаю, как я могу это сделать! Спасибо!
Ответы
Ответ 1
Это отлично работает для меня... можете ли вы вставить полный код и ошибку?
package snippet;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static Timer timer;
public static void main(String[] args) {
Main main = new Main();
main.myTimer(123, "127.0.0.1");
}
public void myTimer(final long MAC, final String ipAddress) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("MAC: " + MAC + "ipAddress:" + ipAddress);
update();
}
};
timer = new Timer();
timer.schedule(timerTask, 1000);
}
public void update() {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("Updated timer");
}
};
timer.cancel();
timer = new Timer();
timer.schedule(timerTask, 2000);
}
}
Выводится:
MAC: 123ipAddress:127.0.0.1
Updated timer
Ответ 2
Вам нужно создать новый объект TimerTask каждый раз при перезапуске таймера.
Итак, создайте новую в Start. И уничтожьте таймер с помощью "Timer.cancel" и "Timer.purge".
Например, у меня есть две кнопки - "Пуск" и "Стоп"
mStartButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mTimerTask = new TimerTask();//This creates new TimerTask
timer = new Timer(); //Instantiate again, as we Cancel the Timer
timer.schedule(mTimerTask, 0, 30);
}
});
mEndButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
timer.cancel();
timer.purge();
}
});