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?

37
demandé sur Avadhani Y 2010-01-29 15:08:14

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() ou cancel() sur le Timer au lieu du TimerTask

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);
        }
    }
};
27
répondu CommonsWare 2010-01-29 12:21:10

En utilisant votre code, au lieu de

scanTask.cancel();

La bonne façon est d'annuler votre minuterie (pas timerTask):

t.cancel();
6
répondu tony gil 2012-07-29 21:48:48

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.

5
répondu Mike 2011-03-03 16:17:28