web-dev-qa-db-fra.com

Replanifier le minuteur dans android

Comment puis-je reporter une minuterie. J'ai essayé d'annuler le minuteur/la tâche de temps et de le programmer à nouveau en utilisant une méthode. Mais cela montre une erreur d'exception:

 Exception errorjava.lang.IllegalStateException: TimerTask est déjà planifié 

Code je l'ai utilisé:

 minuteur privé = nouveau minuteur ("alertTimer", true); 
 public void reScheduleTimer (int duration) {
 timer.cancel (); 
 timer. planning (timerTask, 1000L, durée * 1000L); 
} 
35
Dijo David

Si vous voyez la documentation sur Timer.cancel (), vous verrez ceci:

"Annule le minuteur et toutes les tâches planifiées. Si une tâche est en cours d'exécution, elle n'est pas affectée. Aucune autre tâche ne peut être planifiée sur ce minuteur. Les appels suivants ne font rien."

Vous devrez initialiser un nouveau minuteur lors de la replanification:

ÉDITER:

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
  }
}
59
Eric Nordvik

En fait, si vous regardez dans la méthode d'annulation javadoc , vous pouvez voir la chose suivante:

N'interfère pas avec une tâche en cours d'exécution (si elle existe).

Cela indique à la minuterie "ok, plus de tâches maintenant, mais vous pouvez terminer celle que vous faites". Je pense que vous devrez également annuler la TimerTask .

4
Valentin Rocher

La réponse @Eric Nordvik fonctionne bien.

Une chose que nous pouvons faire est de annuler l'exécution des événements de minuterie précédents

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
Kushal