¿Los hilos son lo suficientemente fiables para calcular segundos?

Estoy haciendo una aplicación de Android que en alguna actividad muestra un temporizador con horas minutos y segundos. Como el valor de segundos se actualizará cada segundo, yo estaba pensando en hacer un hilo con 1000 ms de sueño, después de cada ciclo se agregará 1 a segundos y actualizar la vista de texto. En consecuencia, calculará minutos y horas y actualizará las vistas de texto respectivas.

Pero tengo una duda en mente, son hilos confiables suficiente para llevar a cabo tal tarea o debo utilizar la función de biblioteca incorporada para obtener segundos después de cada ciclo? Estoy un poco preocupado por conseguir mi temporizador salir de sincronía si me baso completamente en el hilo para calcular el tiempo.

El sueño no es suficiente.

Sleep hará una pausa en el hilo durante un período mínimo de tiempo especificado, pero el período de sueño real puede ser más largo que el tiempo especificado.

Utilice el controlador . Aquí hay un muy buen post detallado sobre eso.

 long startTime = 0; Handler timerHandler = new Handler(); Runnable timerRunnable = new Runnable() { @Override public void run() { long millis = System.currentTimeMillis() - startTime; int seconds = (int) Math.round(diff / ((double)1000)); int minutes = (int) Math.round(seconds / ((double)60)); seconds = seconds % 60; // Use the seconds timerHandler.postDelayed(this, 500); } }; 

Iniciar temporizador-

 startTime = System.currentTimeMillis(); timerHandler.postDelayed(timerRunnable, 0); 

Detener temporizador-

 timerHandler.removeCallbacks(timerRunnable); 

En pausa-

 timerHandler.removeCallbacks(timerRunnable); 

Dormir con 1000 ms de retraso es mala opción, ya que siempre hay un jitter y también un poco de tiempo de CPU se gasta en la ejecución de su rutina.

Propongo aprovechar el método ScheduledExecutorService.scheduleAtFixedRate , que llamará a su implementación a tasa fija.

Con la lógica que ha descrito, de hecho obtendrá algo a la deriva , es decir, el pequeño error que puede obtener cada ciclo se sumará a una cantidad significativa. Sin embargo, es fácil de remediar.

Simplemente mantenga una variable manteniendo el tiempo del último disparador. Cuando termine el sueño, añada 1000 al último tiempo de activación, calcule el resto hasta ese momento y duerma durante ese tiempo. De esta manera usted puede obtener el desencadenador tarde ocasional, pero se solucionará rápidamente.

Nunca se debe confiar en el sleep hilo. No garantiza la diferencia horaria exacta.

Te sugiero que utilices una tarea de temporizador. Es fácil de usar y confiable.

Buena suerte.

Pero tengo una duda en mente, los hilos son lo suficientemente confiables para llevar a cabo tal tarea

No, no lo son.

Puede utilizar un subproceso para actualizar la visualización del reloj, pero debe volver a leer System.currentTimeMillis () (o similar).

Mientras que si dices dormir por 1 segundo el hilo durará por 1 segundo, el tiempo real en el cual tu instrucción ocurre cuando el hilo se despierta depende de otros factores tales como la programación de hilo del OS y la CPU. Es poco probable que tenga un impacto enorme, pero ¿por qué no simplemente mantener un registro de las marcas de tiempo reales para que sepas exactamente cuánto tiempo ha transcurrido y corregir en consecuencia si hay alguna diferencia?

Puedes usar algo simple como System.currentTimeMillis()

Su no posible con el hilo simple con sueño en androide. Simplemente utilice el hilo de ejecución.

Inicie esto cuando u necesita actualizar su texto según segundos. En esto lo intenté con minutos, segundos y millise3conds.

Sólo echa un vistazo.

Cree una vista de texto y ajuste el texto con el siguiente ejecutable.

  private Runnable updateTimerThread = new Runnable() { public void run() { timeInMilliseconds = SystemClock.uptimeMillis() - startTime; updatedTime = timeSwapBuff + timeInMilliseconds; int secs = (int) (updatedTime / 1000); int mins = secs / 60; secs = secs % 60; int milliseconds = (int) (updatedTime % 1000); t1.setText("" + mins + ":" + String.format("%02d", secs) + ":" + String.format("%03d", milliseconds)); customHandler.postDelayed(this, 0); } }; 

Como otros han señalado, sleep(millis) sólo garantiza dormir por lo menos la cantidad de milisegundos – lo que significa que si se utiliza 1000 lugar de un desplazamiento se quedará rezagado.

Uso con offset:

 long last = System.currentTimeMillis(); while (true) { long current = System.currentTimeMillis(); Thread.sleep(last-current); last = current; incrementSeconds(); } 
  • Aplicación de tiempo de uso de seguimiento de Android android en Android
  • Android: ejemplo de getRelativeTime
  • Separar horas de minutos en un valor de tiempo dado
  • El tiempo de conexión expiro
  • Cómo administrar la expiración de prueba sin conexión para una aplicación de Android?
  • ¿Cómo se calcula el tiempo del rezo musulmán en una aplicación androide?
  • Comprobación si CountDownTimer se está ejecutando
  • SimpleDateFormat.getTimeInstance ignora el formato de 24 horas
  • Tiempo de generación de DH Keypair en Android
  • Retardo de tiempo en Android
  • Tiempo desde el primer arranque
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.