Saltar al contenido

Cómo implementar el temporizador con corrutinas de Kotlin

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 haciendo su trabajo mientras su “suscripción” hace algo por cada “tick”, puede launch una corrutina de fondo que leerá de 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 el interior 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.

Viejo :

La solución de Joffrey funciona para mí, pero encontré un problema con el bucle for.

Tengo que cancelar mi ticker en el bucle for como este:

            val ticker = ticker(500, 0)
            for (event in ticker) {
                if (...) {
                    ticker.cancel()
                } else {
                    ...
                    }
                }
            }

Pero ticker.cancel() estaba lanzando una cancelaciónException porque el bucle for continuó 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 {
                        ...
                        }
                    }
                }
¡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 *