usar tiempo thread proceso metodo entre ejecutar diferencia determinado como clase cierto cada java android multithreading handler timertask

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