Nuestros desarrolladores estrellas agotaron sus reservas de café, en su búsqueda todo el tiempo por la resolución, hasta que Ada halló la contestación en Gitea y ahora la compartimos aquí.
Solución:
Creo que todavía es experimental, pero puede usar un TickerChannel para producir valores cada X milis:
val tickerChannel = ticker(delayMillis = 60_000, initialDelayMillis = 0)
repeat(10)
tickerChannel.receive()
val currentTime = LocalDateTime.now()
println(currentTime)
Si necesita continuar con su trabajo mientras su “suscriptor” hace algo por cada “tick”, puede launch
una rutina de fondo que leerá desde este canal y hará lo que quieras:
val tickerChannel = ticker(delayMillis = 60_000, initialDelayMillis = 0)
launch
for (event in tickerChannel)
// the 'event' variable is of type Unit, so we don't really care about it
val currentTime = LocalDateTime.now()
println(currentTime)
delay(1000)
// when you're done with the ticker and don't want more events
tickerChannel.cancel()
Si desea detenerse desde dentro del bucle, simplemente puede salir de él y luego cancelar el canal:
val ticker = ticker(500, 0)
var count = 0
for (event in ticker)
count++
if (count == 4)
break
else
println(count)
ticker.cancel()
Puedes crear un temporizador de cuenta regresiva como este
GlobalScope.launch(Dispatchers.Main)
val totalSeconds = TimeUnit.MINUTES.toSeconds(2)
val tickSeconds = 1
for (second in totalSeconds downTo tickSeconds)
val time = String.format("%02d:%02d",
TimeUnit.SECONDS.toMinutes(second),
second - TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(second))
)
timerTextView?.text = time
delay(1000)
timerTextView?.text = "Done!"
Editar: Joffrey ha editado su solución con un mejor enfoque.
Antiguo :
La solución de Joffrey funciona para mí, pero me encontré con un problema con el bucle for.
Tengo que cancelar mi ticker en el ciclo for de esta manera:
val ticker = ticker(500, 0)
for (event in ticker)
if (...)
ticker.cancel()
else
...
}
Pero ticker.cancel()
estaba lanzando una excepción de cancelación porque el ciclo for siguió funcionando después de esto.
Tuve que usar un bucle while para verificar si el canal no estaba cerrado para no obtener esta excepción.
val ticker = ticker(500, 0)
while (!ticker.isClosedForReceive && ticker.iterator().hasNext())
if (...)
ticker.cancel()
else
...
}