¿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.
- que muestran la hora actual en TimePicker en android
- Cómo sincronizar correctamente el código RenderScript de Android en Nvidia Shield
- Java cómo incrementar un int 1 cada segundo hasta que llegue a 15
- Android: obtenga tiempo hasta que Runnable se ejecute a través de Handler
- Detener temporizador sin destruir y volver a crear - Android
- JodaTime - Compruebe si LocalTime es después de ahora y ahora antes de otro LocalTime
- Tiempo del temporizador de cuenta regresiva androide
- Fecha de EditarTexto
- Tiempo de sincronización para la grabación de datos en varios dispositivos Android
- ¿Cómo puedo mostrar la hora en formato 24 horas usando un TextClock?
- Quiero obtener tiempo de la red GSM
- Problema de Android para averiguar la última corrección GPS reciente
- ¿Cómo puedo obtener la fecha y la hora del proveedor de la red?
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(); }
- Eclipse no muestra diseño gráfico para archivos XML de Android
- 2 iconos de aplicación después de instalar el release apk, utilizando gradle build