2011-03-07 11 views
32

¿Cómo puedo reprogramar un temporizador? Intenté cancelar el temporizador/registro horario y programarlo de nuevo con un método. Sin embargo, su mostrando un error de excepción:reprogramar el cronómetro en android

 
Exception errorjava.lang.IllegalStateException: TimerTask is scheduled already 

Código lo he utilizado:

 
private Timer timer = new Timer("alertTimer",true); 
public void reScheduleTimer(int duration) { 
    timer.cancel(); 
    timer.schedule(timerTask, 1000L, duration * 1000L); 
} 
+0

Sería más fácil ayudar si usted fija el código en el que cancelar el temporizador. –

+0

¿podría darnos el código que ha estado usando para hacer eso? Será mucho más fácil ayudarte de esta manera –

+0

He agregado mi código. No estoy seguro si es correcto o no. También lo intenté cancelando timeTask. –

Respuesta

55

Si ve la documentación sobre Timer.cancel() verás esto:..

"Cancela el temporizador y todas las tareas programadas Si hay una tarea actualmente en ejecución no se ve afectada no más tareas puede programarse en este temporizador. Las llamadas posteriores no hacen nada ".

Usted necesitará para inicializar un nuevo temporizador cuando se está reprogramación:

EDIT:

public void reScheduleTimer(int duration) { 
    timer = new Timer("alertTimer",true); 
    timerTask = new MyTimerTask(); 
    timer.schedule(timerTask, 1000L, duration * 1000L); 
} 

private class MyTimerTask extends TimerTask { 
    @Override 
    public void run() { 
    // Do stuff 
    } 
} 
+4

Lo he intentado pero aún aparece el error! :( –

+5

Es tu timerTask el problema. Intenta volver a crear el timerTask cuando reprogrames el temporizador. –

+0

Hola, he vuelto a crear el timerTask. No hay ningún error, pero se detuvo la tarea programada. ¿Puedes actualizar el código en tu respuesta? para que pueda referirlo ... –

4

De hecho, si nos fijamos en el cancel method javadoc, se puede ver lo siguiente:

Does not interfere with a currently executing task (if it exists).

Eso le dice al temporizador "ok, no hay más tareas ahora, pero puede terminar la que está haciendo". Creo que también necesitarás cancel the TimerTask.

+0

Gracias Valentin Rocher ... –

-1

En realidad se puede utilizar purge() por lo que no tiene que inicializar una nueva Timer.

public int purge()

Added in API level 1 Removes all canceled tasks from the task queue. If there are no other references on the tasks, then after this call they are free to be garbage collected.

Returns the number of canceled tasks that were removed from the task queue.

+0

No funcionó para mí .... Lo probé ... ¿Puede dar una secuencia de llamadas API para ¿esta? – Kushal

0

@Eric Nordvik answer funciona bien.

Una cosa que podemos hacer es cancelar la anterior ejecución de los eventos del temporizador

public void reScheduleTimer(int duration) { 

    // Cancel previous timer first 
    timer.cancel(); 

    timer = new Timer("alertTimer",true); 
    timerTask = new MyTimerTask(); 
    timer.schedule(timerTask, 1000L, duration * 1000L); 
}