Tengo una variable en mi código que dice "estado".
Quiero mostrar algo de texto en la aplicación dependiendo de este valor variable. Esto debe hacerse con un retraso de tiempo específico.
Es como,
Comprobar el valor de la variable de estado
Mostrar texto
Espera 10 segundos
Comprobar el valor de la variable de estado
Mostrar texto
Espera 15 segundos
y así. El retraso de tiempo puede variar y se establece una vez que se muestra el texto.
Lo intenté Thread.sleep(time delay)
y falló. ¿Alguna mejor manera de hacer esto?
android
android-thread
Kalpa Pathum Welivitigoda
fuente
fuente
Respuestas:
Debes usar
Handler
lapostDelayed
función para este propósito. Ejecutará su código con el retraso especificado en el hilo principal de la interfaz de usuario, por lo que podrá actualizar los controles de la interfaz de usuario.fuente
Para cualquier persona interesada, aquí hay una clase que creé usando el código de inazaruk que crea todo lo necesario (lo llamé UIUpdater porque lo uso para actualizar periódicamente la interfaz de usuario, pero puede llamarlo como quiera):
Luego puede crear un objeto UIUpdater dentro de su clase y usarlo así:
Si desea usar esto como un actualizador de actividad, coloque la llamada de inicio dentro del método onResume () y la llamada de detención dentro de onPause (), para que las actualizaciones se inicien y detengan de acuerdo con la visibilidad de la actividad.
fuente
UPDATE_INTERVAL = interval;
debe estar antesthis(uiUpdater);
enUIUpdater(Runnable uiUpdater, int interval)
(ya que el valor deUPDATE_INTERVAL
se usa y debe ser el que se pasa como parámetrointerval;
). También evite el ancho de más de 80 caracteres en el código cuando sea posible (casi siempre;)new Handler(Looper.getMainLooper())
. En segundo lugar, no valida los argumentos, por lo que se traga Runnables nulos e intervalos negativos. Finalmente, no tiene en cuenta el tiempo que pasa en lauiUpdater.run()
línea, ni maneja posibles excepciones generadas por ese método. Además, no es hilo de seguridad, que debe hacerstart
ystop
métodos sincronizados.error: call to this must be first statement in constructor
tal vez hay una solución fácil.Creo que lo nuevo es usar un ScheduledThreadPoolExecutor . Al igual que:
fuente
Executors.newSingleThreadScheduledExecutor()
Puede ser otra opción aquí.El temporizador funciona bien. Aquí, uso el temporizador para buscar texto después de 1.5s y actualizar la interfaz de usuario. Espero que ayude.
fuente
Hay 3 formas de hacerlo:
Utilice ScheduledThreadPoolExecutor
Un poco exagerado ya que no necesitas un grupo de hilos
Usar tarea de temporizador
Estilo antiguo de Android
Use Handler y Runnable
Estilo moderno de Android
Controlador sin fugas con actividad / contexto
Declare una clase de controlador interno que no pierda memoria en su clase de actividad / fragmento
Declare un ejecutable que realizará su tarea repetitiva en su clase Actividad / Fragmento
Inicialice el objeto Handler en su Activity / Fragment (aquí FlashActivity es mi clase de actividad)
Para repetir una tarea después del intervalo de tiempo fijo
Para detener la repetición de la tarea.
ACTUALIZACIÓN: en Kotlin:
fuente
El temporizador es otra forma de hacer su trabajo, pero asegúrese de agregarlo
runOnUiThread
si está trabajando con la interfaz de usuario.y xml es ...
Programe una cuenta regresiva hasta un momento en el futuro, con notificaciones regulares en intervalos a lo largo del camino. Ejemplo de mostrar una cuenta regresiva de 30 segundos en un campo de texto:
Para detalles
fuente
¡Intenta seguir el ejemplo que funciona!
Use [Handler] en el método onCreate () que utiliza el método postDelayed () que hace que el Runnable se agregue a la cola de mensajes y se ejecute después de que transcurra el tiempo especificado que es 0 en el ejemplo dado. 1
Consulte este código:
fuente
Puede usar un controlador para publicar código ejecutable. Esta técnica se describe muy bien aquí: https://guides.codepath.com/android/Repeating-Periodic-Tasks
fuente
Con base en la publicación anterior sobre el ScheduledThreadPoolExecutor , se me ocurrió una utilidad que se adaptaba a mis necesidades (quería activar un método cada 3 segundos):
fuente
En mi caso, tuve que ejecutar un proceso si una de estas condiciones era cierta: si se completó un proceso anterior o si ya habían pasado 5 segundos. Entonces, hice lo siguiente y funcionó bastante bien:
Si se lee el proceso1, se ejecuta el proceso2. Si no, incrementa los tiempos variables y hace que el controlador se ejecute después de un segundo. Mantiene un ciclo hasta que se lee el proceso1 o los tiempos son 5. Cuando los tiempos son 5, significa que pasaron 5 segundos y en cada segundo, se ejecuta la cláusula if de process1.isRead ().
fuente
Usar kotlin y su Coroutine es bastante fácil, primero declare un trabajo en su clase (mejor en su modelo de vista) así:
luego, cuando desee crear y comenzar, haga esto:
y si quieres terminarlo:
PD:
viewModelScope
solo está disponible en modelos de vista, puede usar otros ámbitos de Coroutine comowithContext(Dispatchers.IO)
Más información: aquí
fuente
Para las personas que usan Kotlin, la respuesta de inazaruk no funcionará, el IDE requerirá que se inicialice la variable, por lo que en lugar de usar el
postDelayed
interiorRunnable
, la usaremos en un método separado.Inicialice
Runnable
así:Inicialice su
runDelayedHandler
método de esta manera:Como puede ver, este enfoque le permitirá controlar la vida útil de la tarea, realizar un seguimiento
keepRunning
y cambiarla durante la vida útil de la aplicación hará el trabajo por usted.fuente