SetTimeOut en Android

Antonio Huerta Reyes - Dec 4 '21 - - Dev Community

En muchas ocasiones como desarrolladores Android nos hemos encontrado con la necesidad de realizar un proceso pasado cierta cantidad de tiempo o de realizar una cuenta regresiva que permita realizar una acción, en muchos de estos casos solemos hacer uso de los Handler o posiblemente de la funcionalidad delay en las coroutines de kotlin.

En esta ocasión traigo una alternativa que me ha funcionado exitosamente para muchas de mis implementaciones y que puede ser de utilidad también para muchos desarrolladores Android.

fun setTimeOut(handleFunction: () -> Unit, delay: Long): CountDownTimer {

    val timer = object: CountDownTimer(delay, 1000){
        override fun onFinish() {
            CoroutineScope(Dispatchers.Main).launch {
                handleFunction()
                cancel()
            }
        }

        override fun onTick(p0: Long) {}
    }

    timer.start()

    return timer
}

fun clearTimeOut(timer: CountDownTimer){
    try {
        timer.cancel()
    }catch (e: Exception){
        Log.e("Error", e.toString())
    }
}
Enter fullscreen mode Exit fullscreen mode

Esta alternativa tiene como base el uso de la clase CountDownTimer de Android que en la propia definición de la documentación de Android es:

Schedule a countdown until a time in the future, with regular notifications on intervals along the way. Example of showing a 30 second countdown in a text field

Dicha clase nos permite programar una cuenta regresiva hasta un momento en el futuro con notificaciones regulares de los intervalos, y como se puede observar esta alternativa hace uso de funciones al estilo de JavaScript.

Nuestra función setTimeOut recibe como parámetros la función que se desea ejecutar tras determinado tiempo, este tiempo viene como el segundo parámetro el cual define en cuantos milisegundos deseas ejecutar la acción.

El segundo parámetro de la instancia de CountDownTimer es el intervalo que estará ejecutando el método onTick, en mi ejemplo lo he definido a un segundo, esta función a su ves regresa la instancia de CountDownTimer creada para su manipulación desde donde se llame la función o para hacer uso de la segunda función en el ejemplo.

La función clearTimeOut permite detener la ejecución de nuestro CountDownTimer antes de que este finalice su tarea.

Un ejemplo practico para estas dos funciones puede ser un buscador con conexión a una RestApi en donde deseamos llamar al endpoint que nos regresa los datos filtrados tras un determinado tiempo que se detecte que el usuario dejo de escribir.

En dicho caso haríamos el siguiente ejemplo:

    private lateinit var timeOutRef: CountDownTimer

    private fun setUpSearchEditText(){
        binding.searchInput.doOnTextChanged { text, start, before, count ->
            if(this::timeOutRef.isInitialized){
                clearTimeOut(this.timeOutRef)
            }

            timeOutRef = setTimeOut({ Log.d("TimeOut","Enviar al endpoint") }, 1000)
        }
    }
Enter fullscreen mode Exit fullscreen mode

Espero que este pequeño blog y funciones sean de ayuda para otros programadores como lo fue en mi caso, de la misma manera les dejo el enlace al gist por si desean copiarlo y adaptarlo a sus necesidades.

https://gist.github.com/AntonioHReyes/73a3184362dc8d9a65157070695d87cb

. . .