java - tiempo - TimerTask vs Thread.sleep vs Handler postDelayed: ¿la función más precisa para llamar cada N milisegundos?
ejecutar metodo cada cierto tiempo android (4)
¿Cuál es la forma más precisa de llamar a una función cada N milisegundos?
- Thread with Thread.sleep
- TimerTask
- Manejador con postDelayed
Modifiqué este ejemplo usando Thread.sleep y no es muy preciso.
Estoy desarrollando una aplicación de música que reproducirá sonidos en un BPM determinado. Entiendo que es imposible crear un metrónomo completamente preciso y no necesito hacerlo, solo estoy buscando la mejor manera de hacerlo.
Gracias
En Android, puede crear subprocesos con su propio controlador / cola de mensajes. Es bastante preciso Cuando vea la documentación de Handler, verá que está diseñada para eso.
Hay dos usos principales para un controlador: (1) programar mensajes y ejecutables para que se ejecuten como un punto en el futuro; y (2) para poner en cola una acción que se realizará en un hilo diferente al suyo.
Hay algunas desventajas de usar Timer
- Crea solo un hilo para ejecutar las tareas y si una tarea tarda demasiado en ejecutarse, otras tareas sufren.
- No maneja las excepciones lanzadas por las tareas y el hilo simplemente termina, lo que afecta a otras tareas programadas y nunca se ejecutan
ScheduledThreadPoolExecutor se ocupa adecuadamente de todos estos problemas y no tiene sentido utilizar el temporizador. Hay dos métodos que podrían ser de utilidad en su caso: scheduleAtFixedRate (...) y scheduleWithFixedDelay (..)
class MyTask implements Runnable {
@Override
public void run() {
System.out.println("Hello world");
}
}
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
long period = 100; // the period between successive executions
exec.scheduleAtFixedRate(new MyTask(), 0, period, TimeUnit.MICROSECONDS);
long delay = 100; //the delay between the termination of one execution and the commencement of the next
exec.scheduleWithFixedDelay(new MyTask(), 0, delay, TimeUnit.MICROSECONDS);
Todos son igual de precisos. La precisión del tiempo de Java está sujeta a la precisión y precisión de los temporizadores y programadores del sistema y no está garantizada. Consulte la API Thread.sleep y Object.wait.
Usar TimerTask para la acción de bucle es el mejor. Recomendar