TimerTask vs Thread.sleep vs Handler postDelayed – más preciso para llamar a la función cada N milisegundos?

¿Cuál es la forma más precisa de llamar a una función cada N milisegundos?

  • Hilo con Thread.sleep
  • TimerTask
  • Manejador con postDelayed

He modificado este ejemplo usando Thread.sleep y no es muy preciso.

Estoy desarrollando una aplicación de música que reproducirá sonidos en un BPM dado. Entiendo que es imposible crear un metrónomo completamente preciso y no necesito hacerlo, solo busco encontrar la mejor manera de hacerlo.

Gracias

4 Solutions collect form web for “TimerTask vs Thread.sleep vs Handler postDelayed – más preciso para llamar a la función cada N milisegundos?”

Hay algunas desventajas de usar Timer

  • Crea solo un solo 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 acaba de terminar, lo que afecta a otras tareas programadas y nunca se ejecutan

ProgramadoThreadPoolExecutor se ocupa correctamente de todos estos problemas y no tiene sentido utilizar Timer .. Hay dos métodos que podrían ser de uso en su caso .. scheduleAtFixedRate (…) and 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); 

En Android puedes crear Thread con su propio Handler / Message Queue. Es bastante preciso. Cuando vea la documentación de Handler puede ver, que fue diseñada para eso.

Hay dos usos principales para un Handler: (1) programar mensajes y ejecutables que se ejecutarán como un punto en el futuro; Y (2) para enquear una acción que se realizará en un hilo diferente que el suyo propio.

Todos son iguales en cuanto a precisión. La precisión de la sincronización de Java está sujeta a la precisión y precisión de los temporizadores y programadores del sistema y no está garantizada. Vea Thread.sleep y Object.wait API.

Usar TimerTask para la acción de bucle es el mejor. Recomendar

  • Detener temporizador sin destruir y volver a crear - Android
  • Cómo ejecutar la tarea Async repetidamente después de intervalos de tiempo fijos
  • Cómo pausar y reanudar un TimerTask / Timer
  • Tema de Android Simple Timer / Timertask
  • Intentar invocar método virtual
  • Timer y TimerTask en Android
  • Lanzar null pointerException en Timer.Schedule ();
  • Error de Android: "No se pudo crear la instancia de epoll" o "No se pudo crear el canal de despertador"
  • Android: haga una parte del código cada 5 segundos
  • Java - Timer.cancel () v / s TimerTask.cancel ()
  • ¿Cuál es el mejor método para ejecutar una tarea repetidamente en android? (Ej .: - Actualización de puntajes, Actualización Ui)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.