2012-04-26 3 views
17

Я хотел бы сделать таймер, он будет перезапущен, когда что-то происходит:перезапустить таймер в 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) 

Я не знаю, как я могу это сделать! Благодаря!

+4

Какая ошибка? – NPE

+0

забыл вставить ошибку? –

+0

и снимите таймер = новый таймер(); это не должно быть необходимо – ControlAltDel

ответ

13

Это прекрасно работает для меня ... вы можете вставить полный код и ошибку?

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 
+0

Так жаль! это была какая-то ошибка, я думал, что я вставил ошибку! java.lang.IllegalStateException: Задача уже запланированы или отменены на java.util.Timer.sched (Timer.java:358) в java.util.Timer.schedule (Timer.java:170) в spb.keepAliveTimer. обновить (keepAliveTimer.java:37) на spb.keepAlive.update (keepAlive.java:58) на spb.receptor.keepAlive (receptor.java:475) на spb.receptor.run (receptor.java:118) at java.lang.Thread.run (Thread.java:662) – user1256477

+0

Это сработало для меня! Большое спасибо! – user1256477

+4

Вы не можете отменить и перенести TimerTask. Вы должны создать новый экземпляр TimerTask каждый раз, когда вы его планируете. Вот почему код в этом ответе работает, а фрагмент кода в вопросе не работает. – pavon

6

Вы должны создать новый объект 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(); 
} 
}); 
Смежные вопросы