Saltar al contenido

Cómo implementar el temporizador con las rutinas de Kotlin

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 
                        ...
                        
                    
                }

Aquí tienes las reseñas y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *