2010-01-29 12 views
37

Actualmente estoy tratando de configurar un escaneo WiFi en mi aplicación Android que escanea puntos de acceso WiFi cada 30 segundos.Android - ¿Controla una tarea con Timer y TimerTask?

He utilizado Timer y TimerTask para que el escaneo funcione correctamente en los intervalos que necesito.

Sin embargo, quiero poder detener e iniciar el escaneo cuando el usuario presiona un botón y actualmente tengo problemas para detener y luego reiniciar el temporizador y TimerTask.

Aquí está mi código

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

} 

Así que el temporizador y el inicio de la tarea bien y la exploración ocurre cada 30 segundos, sin embargo no puedo conseguir que se detenga, puedo detener el temporizador, pero la tarea todavía se produce y scanTask. cancel() tampoco parece funcionar.

¿Hay una mejor manera de hacerlo? ¿O me falta algo en las clases de Timer/TimerTask?

Respuesta

26

Usted podría considerar:

  • Examinando el resultado booleano de llamar cancel() en su tarea, ya que debe indicar si su solicitud tiene éxito o fracasa
  • Trate purge() o cancel() en el Timer en lugar de la TimerTask

Si no necesita necesariamente Timer y TimerTask, siempre puede use postDelayed() (disponible en Handler y en cualquier View). Esto programará un Runnable para ser ejecutado en el hilo de UI después de un retraso. Para que vuelva a ocurrir, simplemente haz que se programe de nuevo después de hacer tu trabajo periódico. Luego puede monitorear un indicador booleano para indicar cuándo debe finalizar este proceso. Por ejemplo:

private Runnable onEverySecond=new Runnable() { 
    public void run() { 
     // do real work here 

     if (!isPaused) { 
      someLikelyWidget.postDelayed(onEverySecond, 1000); 
     } 
    } 
}; 
+0

Traté de comprobar el valor booleano en la scanTask como esto booleano tf = scanTask.cancel(); Pero ahora obtengo una excepción de puntero nulo en esa línea. Sin embargo, la tarea en sí funciona bien? Eventualmente estaré ejecutando el código en un Servicio, ¿así que usar postDelayed sería una opción? –

+0

Obviamente, 'scanTask' se restablece a' null', y de los fragmentos de código que ha presentado es imposible decir por qué o nhow. 'postDelayed()' no es una opción en un 'Servicio', pero no está claro por qué quiere/necesita un' Servicio' en este caso. – CommonsWare

+0

scanTask no se utiliza en ningún otro lugar en el código de toda la aplicación, ni es contador de tiempo, lo que he publicado es todo el uso del temporizador T y la TimerTask scanTask. Quiero crear una aplicación con una IU mínima o nula, así que al leer acerca de Android, ¿un servicio es la manera de hacerlo? –

5

La documentación de Android dice que cancelar() cancela el temporizador y todas las tareas programadas. Si hay una tarea actualmente en ejecución, no se ve afectada. No se pueden programar más tareas en este temporizador. Las llamadas subsiguientes no hacen nada. Lo cual explica el problema.

6

utilizando su código, en lugar de

scanTask.cancel(); 

la forma correcta es cancelar su temporizador (no TimerTask):

t.cancel(); 
Cuestiones relacionadas