Android Timer: postDelayed vs. schedule

¡Por favor no ponga esto en espera, por favor no marque como duplicado y por favor contáctame! Necesito cosas para hacer cada 200 milisegundos y necesito que sea suave y uniforme. La tarea a realizar es de peso medio (en ambos casos, de la pregunta 1 y 2). La búsqueda de temporizadores se ve como la mejor solución de la comunidad es utilizar un controlador, un runnable y postDelayed (), ( ¿Cómo funciona Android? ).

Preguntas actualizadas:

-¿Qué manera es más precisa y rápida si tengo que interactuar con la interfaz de usuario, postDelayed () o schedule () / scheduleAtFixedRate ()?

-¿Qué manera es más precisa y rápida si no tengo que interactuar con la interfaz de usuario, postDelayed () o schedule () / scheduleAtFixedRate ()?

-¿Puede ser ejecutado en el proceso principal o en otro? cómo ?

Gracias. Algunos ejemplos …

De esta manera tengo los objetos locales mainclass, pero ¿es un nuevo hilo? ¿Es una buena práctica?

timer.schedule( new TimerTask() { @Override public void run() { textview.setText(str); //other stuff } }, 0, 200); 

El siguiente es otro con el programa, la tarea está en una tarea separada, no el temporizador en sí, supongo, y no puedo interactuar con la interfaz de usuario directlly, supongo …

 timer.schedule( new aclass(), 0, 200); 

Manera del manejador (de Dave.B):

 Handler timerHandler = new Handler(); Runnable timerRunnable = new Runnable() { @Override public void run() { TextView.setText(str); // other stuff timerHandler.postDelayed(this, 500); } }; @Override public void onCreate(Bundle savedInstanceState) { ... timerHandler.postDelayed(timerRunnable, 0); } 

Timer ejecuta sus tareas en un subproceso separado que se utiliza sólo para tareas de servicio creadas por este temporizador en particular. Handler ejecuta su tarea en el hilo de su Looper que puede o no puede ser un subproceso de interfaz de usuario. Generalmente hablando no hay mucha diferencia entre estas dos clases si usas Handler en un hilo separado. Pero es más común en Android usar Handler y HandlerThread .

Si necesita interactuar con la interfaz de usuario, es mejor utilizar Handler en el hilo principal para evitar el cambio de contexto. Pero en este caso puede haber algunos retrasos porque el rendimiento de dicho temporizador dependerá del rendimiento general de la interfaz de usuario.

ACTUALIZACIÓN : En el tercer ejemplo, Runnable se ejecuta en el subproceso principal. Supongo que todo el código de este ejemplo se encuentra en una subclase de Activity .

Handler , Timer y ScheduledExecutorService usan el mismo enfoque para programar tareas. No estoy seguro de que pueda obtener cambios significativos en la precisión o el rendimiento al cambiar de una implementación a otra.

ACTUALIZACIÓN : Por último, le recomendaría el siguiente enfoque para elegir un temporizador:

  1. Utilice ScheduledExecutorService si necesita una tarea para ejecutarse en un subproceso separado o / y la tarea es demasiado pesada para el subproceso principal.
  2. Utilice el controlador para ejecutar tareas en el subproceso principal o si necesita su funcionalidad de cola de mensajes.
  3. No utilice Timer , utilice ScheduledExecutorService lugar.

Preferiré usar ScheduledThreadPoolExecutor porque el temporizador ejecuta su tarea secuencialmente, por lo que si hay más de una tarea a la vez, las tareas restantes se retrasarán. Mientras que ScheduledThreadPoolExecutor tiene un grupo de hilos y permite que múltiples tareas se ejecuten en paralelo, por lo que no habrá retraso.

Handler postdelayed método es para publicar su ejecución en el hilo principal de la interfaz de usuario en Android, lo necesita para hacer todas las cosas relacionadas con la interfaz de usuario . No confunda el temporizador con el controlador postdelayed

Editar 1: Para cosas relacionadas con la interfaz de usuario, puede utilizar el controlador posdelayed. p.ej

 handler.postDelayed(new Runnable() { public void run() { textview.setText(str); //other UI related stuff } }, 200); 
  • Manejador o temporizador android
  • Fiabilidad del método postDelay de Android
  • ¿Cómo usar Android AlarmManager con intervalos pequeños como 1 minuto?
  • Android: cómo utilizar un temporizador
  • Recibir un valor de cadena en MainActivity de SecondActivity y luego contarlo hacia abajo
  • Cambiar horario scheduleAtFixedRate
  • Timer y TimerTask en Android
  • ¿Cómo hacer un temporizador simple sin nueva clase en Android?
  • Equivalente a javax.swing.Timer en Android
  • CountDownTimer en Android
  • Android CountDownTimer - last onTick no llamado - ¿qué solución limpia para usar?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.