2012-04-26 18 views
17

chciałbym zrobić timer, to zostanie wznowiona, gdy coś się dzieje:ponownie uruchomić stoper w 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); 
} 

Mam problem, gdy tworzę nowy harmonogram, mam ten błąd:

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) 

Nie wiem, jak mogę to zrobić! Dzięki!

+4

Co to jest błąd? – NPE

+0

zapomniałeś wkleić błąd? –

+0

i usuń timer = new Timer(); to nie powinno być konieczne. – ControlAltDel

Odpowiedz

13

To działa dobrze dla mnie ... Czy możesz wkleić pełny kod i błąd?

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); 
    } 
} 

This wyjścia:

 
MAC: 123ipAddress:127.0.0.1 
Updated timer 
+0

Przepraszam! to był jakiś błąd, myślałem, że wkleiłem błąd! java.lang.IllegalStateException: Zadanie już zaplanowane lub anulowane na java.util.Timer.sched (Timer.java:358) na java.util.Timer.schedule (Timer.java:170) na spb.keepAliveTimer. update (keepAliveTimer.java:37) na spb.keepAlive.update (keepAlive.java:58) w spb.receptor.keepAlive (receptor.java:475) w spb.receptor.run (receptor.java:118) w java.lang.Thread.run (Thread.java:662) – user1256477

+0

To zadziałało dla mnie! Dziękuję Ci bardzo! – user1256477

+4

Nie można anulować i zmienić harmonogramu TimerTask. Musisz utworzyć nowe wystąpienie TimerTask za każdym razem, gdy je planujesz. Właśnie dlatego kod w tej odpowiedzi działa, a fragment kodu w pytaniu nie. – pavon

6

Trzeba utworzyć nowy obiekt TimerTask za każdym uruchomieniu stopera. Stwórz więc nowy na Start. I Zniszcz Timer za pomocą "Timer.cancel" i "Timer.purge".

Dla np, mam dwa przyciski - start i stop

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(); 
} 
}); 
Powiązane problemy