2011-03-07 5 views
32

Comment puis-je reprogrammer une minuterie. J'ai essayé d'annuler le timer/timertask et de le programmer de nouveau en utilisant une méthode. Mais sa montrant une erreur d'exception:Reprogrammer la minuterie dans android

 
Exception errorjava.lang.IllegalStateException: TimerTask is scheduled already 

code Je l'ai utilisé:

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

Il serait plus facile d'aider si vous postez le code où vous annulez la minuterie. –

+0

pourriez-vous s'il vous plaît nous donner le code que vous avez utilisé pour faire cela? Il sera beaucoup plus facile de vous aider de cette façon –

+0

J'ai ajouté mon code. Je ne suis pas sûr que ce soit correct ou non. J'ai également essayé en annulant le timeTask. –

Répondre

55

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

« annule la minuterie et toutes les tâches planifiées S'il y a une tâche en cours d'exécution n'est pas affecté tâches Plus de mai être programmé sur cette minuterie, les appels ultérieurs ne font rien. "

Vous devez initialiser une nouvelle minuterie lorsque vous replanifiez:

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

J'ai essayé mais toujours l'erreur montre! :( –

+5

C'est votre problème de timerTask Essayez de recréer le timerTask lorsque vous reprogrammez le timer –

+0

Salut, j'ai recréé le timerTask Il n'y a pas d'erreur mais la tâche a été arrêtée, pouvez-vous mettre à jour le code dans votre réponse pour que je puisse me référer ... –

4

En fait, si vous regardez dans le cancel method javadoc, vous pouvez voir la chose suivante:

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

Cela indique à la minuterie "ok, plus de tâches maintenant, mais vous pouvez terminer celle que vous êtes en train de faire". Je pense que vous aurez également besoin de cancel the TimerTask.

+0

Merci Valentin Rocher ... –

-1

En fait, vous pouvez utiliser purge() de sorte que vous ne devez pas initialiser une nouvelle 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

Cela n'a pas fonctionné pour moi .... Je l'ai essayé ... Pouvez-vous donner une séquence d'appels API pour ce? – Kushal

0

@Eric Nordvik réponse fonctionne bien.

Une chose que nous pouvons faire est de annuler les événements de minuterie précédente exécution

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