texto studio settitle font custom centrar android timer scheduled-tasks

studio - settitle center toolbar android



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

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?


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.


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 programará 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();