2012-04-26 71 views
17

Me gustaría hacer un temporizador, que se reiniciará cuando algo sucede:reiniciar el temporizador en 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); 
} 

tengo un problema al crear el nuevo horario, tengo este error:

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) 

¡No sé cómo puedo hacerlo! ¡Gracias!

+4

¿Cuál es el error? – NPE

+0

se olvidó de pegar el error? –

+0

y eliminar timer = new Timer(); eso no debería ser necesario – ControlAltDel

Respuesta

13

Esto funciona bien para mí ... ¿puedes pegar el código completo y el error?

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

Este salidas:

 
MAC: 123ipAddress:127.0.0.1 
Updated timer 
+0

¡Lo siento! fue algún tipo de error, ¡pensé que había pegado el error! java.lang.IllegalStateException: Tarea ya programada o cancelado en java.util.Timer.sched (Timer.java:358) en java.util.Timer.schedule (Timer.java:170) en spb.keepAliveTimer. update (keepAliveTimer.java:37) en spb.keepAlive.update (keepAlive.java:58) en spb.receptor.keepAlive (receptor.java:475) en spb.receptor.run (receptor.java:118) at java.lang.Thread.run (Thread.java:662) – user1256477

+0

¡Funcionó para mí! ¡Muchas gracias! – user1256477

+4

No puede cancelar y reprogramar una TimerTask. Debe crear una nueva instancia de TimerTask cada vez que lo programe. Es por eso que el código en esta respuesta funciona, y el fragmento de código en la pregunta no. – pavon

6

usted tiene que crear un nuevo objeto cada vez que TimerTask de reiniciar el temporizador. Entonces, crea uno nuevo en Start. Y destruya el temporizador con "Timer.cancel" y "Timer.purge".

Por ejemplo, tengo dos botones - Iniciar y detener

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