Android-contrôler une tâche avec Timer et TimerTask?
J'essaie actuellement de configurer une analyse WiFi dans mon application Android qui recherche les points D'accès WiFi toutes les 30 secondes.
J'ai utilisé Timer et TimerTask pour faire fonctionner l'analyse correctement aux intervalles dont j'ai besoin.
Cependant, je veux être en mesure d'arrêter et de démarrer la numérisation lorsque l'utilisateur appuie sur un bouton et que j'ai actuellement du mal à arrêter, puis à redémarrer la minuterie et TimerTask.
Voici mon code
TimerTask scanTask;
final Handler handler = new Handler();
Timer t = new Timer();
public void doWifiScan(){
scanTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
wifiManager.scan(context);
Log.d("TIMER", "Timer set off");
}
});
}};
t.schedule(scanTask, 300, 30000);
}
public void stopScan(){
if(scanTask!=null){
Log.d("TIMER", "timer canceled");
scanTask.cancel();
}
}
Donc la minuterie et la tâche commencez bien et l'analyse se produit toutes les 30 secondes mais je ne peux pas l'arrêter, je peux arrêter la minuterie mais la tâche se produit toujours et scanTask.annuler() ne semble pas fonctionner non plus.
Y a-t-il une meilleure façon de le faire? Ou est-ce que je manque quelque chose dans les classes Timer/TimerTask?
3 réponses
, Vous pourriez envisager:
- examiner le résultat booléen en appelant
cancel()
sur votre tâche, car il devrait indiquer si votre requête réussit ou échoue - essayez
purge()
oucancel()
sur leTimer
au lieu duTimerTask
Si vous n'avez pas nécessairement besoin d' Timer
et TimerTask
, vous pouvez toujours utiliser postDelayed()
(disponible sur le conducteur et sur tout View
). Cela planifiera un Runnable
à exécuter sur le thread de L'interface utilisateur après un délai. Pour qu'il se reproduise, il suffit de le programmer à nouveau après avoir fait votre travail périodique. Vous pouvez ensuite surveiller un indicateur booléen pour indiquer quand ce processus devrait se terminer. Par exemple:
private Runnable onEverySecond=new Runnable() {
public void run() {
// do real work here
if (!isPaused) {
someLikelyWidget.postDelayed(onEverySecond, 1000);
}
}
};
En utilisant votre code, au lieu de
scanTask.cancel();
La bonne façon est d'annuler votre minuterie (pas timerTask):
t.cancel();
La documentation Android indique que cancel() annule la minuterie et toutes les tâches planifiées. S'il y a une tâche en cours d'exécution, elle n'est pas affectée. Plus de tâches peuvent être planifiées sur cette minuterie. Les appels suivants ne font rien. Ce qui explique le problème.