Android: ¿se controla una tarea con TimerTimer y Timer?

Actualmente estoy tratando de configurar un escaneo WiFi en mi aplicación Android que escanea puntos de acceso WiFi cada 30 segundos.

He usado Timer y TimerTask para que el escaneo funcione correctamente en los intervalos que requiero.

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 la tarea comienzan bien y el escaneo ocurre cada 30 segundos, pero no puedo detenerlo, puedo detener el temporizador pero la tarea todavía ocurre y scanTask.cancel () tampoco parece funcionar.

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

Puede considerar:

  • Examinar el resultado booleano de llamar a cancel() en su tarea, ya que debe indicar si su solicitud tiene éxito o falla
  • Pruebe purge() o cancel() en el Timer lugar de TimerTask

Si no necesita necesariamente Timer y TimerTask , siempre puede usar postDelayed() (disponible en Handler y en cualquier View ). Esto progtwigrá 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); } } }; 

usando su código, en lugar de

 scanTask.cancel(); 

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

 t.cancel(); 

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