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()
ocancel()
en elTimer
lugar deTimerTask
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();