Reprogramar temporizador en Android


¿Cómo puedo reprogramar un temporizador? He intentado cancelar el temporizador / timertask y programarlo nuevamente usando un método. Pero muestra un error de excepción:

Exception errorjava.lang.IllegalStateException: TimerTask is scheduled already

Código Lo he usado:

private Timer timer = new Timer("alertTimer",true);
public void reScheduleTimer(int duration) {
    timer.cancel();
    timer.schedule(timerTask, 1000L, duration * 1000L);
}
Author: Dijo David, 2011-03-07

4 answers

Si ve la documentación en 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 se pueden programar más tareas en este temporizador. Las llamadas posteriores no hacen nada."

Tendrá que inicializar un nuevo temporizador cuando se reprograme:

EDITAR:

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
  }
}
 58
Author: Eric Nordvik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-07 09:40:50

De hecho, si miras en el método de cancelación javadoc , puedes ver lo siguiente:

No interfiere con una tarea actualmente en ejecución (si existe).

Eso le dice al temporizador "ok, no más tareas ahora, pero puedes terminar la que estás haciendo". Creo que también necesitarás cancelar el TimerTask .

 4
Author: Valentin Rocher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-07 08:34:44

@Eric Nordvik respuesta está funcionando bien.

Una cosa que podemos hacer es cancelar la ejecución de eventos anteriores 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);
}
 1
Author: Kushal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-08 11:37:20

En realidad puedes usar purge() para no tener que inicializar un nuevo Timer.

public int purge ()

Añadido en el nivel de API 1 Elimina todas las tareas canceladas de la cola de tareas. Si no hay otras referencias en las tareas, entonces después de esta llamada son libres de ser recogidos basura.

Devuelve el número de tareas canceladas que se eliminaron de la cola de tareas.

 -1
Author: Rox Teddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-05 12:48:43