2010-01-29 4 views
37

J'essaye actuellement de configurer un balayage de WiFi dans mon application d'androïde qui balaye des points d'accès de WiFi toutes les 30 secondes.Android - Contrôler une tâche avec Timer et TimerTask?

J'ai utilisé Timer et TimerTask pour que le scan fonctionne correctement aux intervalles dont j'ai besoin.

Cependant, je veux être en mesure d'arrêter et de lancer le balayage lorsque l'utilisateur appuie sur un bouton et que j'ai actuellement du mal à arrêter puis à redémarrer le Timer et le 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(); 
} 

} 

Ainsi, la minuterie et démarrage de la tâche fin et l'analyse se produit toutes les 30 secondes mais je ne peux pas l'obtenir pour arrêter, je peux arrêter le chronomètre, mais la tâche est encore et scanTask. cancel() ne semble pas fonctionner non plus.

Y a-t-il une meilleure façon de procéder? Ou est-ce qu'il me manque quelque chose dans les classes Timer/TimerTask?

Répondre

26

Vous pourriez envisager:

  • Examiner le résultat booléen d'appeler cancel() sur votre tâche, car il doit indiquer si votre demande réussit ou échoue
  • Essayez purge() ou cancel() sur le Timer au lieu du TimerTask

Si vous n'avez pas nécessairement besoin Timer et TimerTask, vous pouvez toujours utilisez postDelayed() (disponible sur Handler et sur tout View). Cela va programmer un Runnable à exécuter sur le thread de l'interface utilisateur après un délai. Pour que cela 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); 
     } 
    } 
}; 
+0

J'ai essayé de vérifier le booléen sur le scanTask comme celui-ci booléen tf = scanTask.cancel(); Mais maintenant je reçois une exception de pointeur nul sur cette ligne. Cependant, la tâche elle-même fonctionne bien? Je finirai par exécuter le code dans un service, alors utiliser postDelayed serait-il une option? –

+0

De toute évidence, 'scanTask' est en cours de réinitialisation à' null', et à partir des fragments de code que vous avez présentés, il est impossible de dire pourquoi ou nhow. 'postDelayed()' n'est pas une option dans un 'Service', mais il n'est pas clair pourquoi vous voulez/avez besoin d'un' Service' dans ce cas. – CommonsWare

+0

scanTask n'est utilisé nulle part ailleurs dans le code de l'application entière, et Timer non plus, ce que j'ai posté est l'utilisation entière du Timer t et du TimerTask scanTask. Je veux créer une application avec un minimum d'interface utilisateur, donc à partir de la lecture sur Android, un service est le moyen de le faire? –

5

La documentation Android indique que cancel() 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 cette minuterie. Les appels ultérieurs ne font rien. Ce qui explique le problème.

6

en utilisant votre code, au lieu de

scanTask.cancel(); 

la manière correcte est d'annuler votre minuterie (non TimerTask):

t.cancel(); 
Questions connexes