Aquí y allá, en tu proyecto android, tiendes a necesitar formas de ejecutar código repetitivamente o después de un cierto período. Existe la forma estándar de utilizar la clase Handler, sin embargo, esto puede conducir a fugas de memoria en su aplicación. En este artículo, veremos algunas soluciones fáciles de terceros para este problema.

Preguntas que este artículo responde

  1. ¿Cómo se ejecuta un trozo de código de forma repetitiva?
  2. ¿Cómo se ejecuta un trozo de código después de una determinada duración?

(a) Solución 1: Utilizar la librería every-after.

¡La biblioteca de Android para ejecutar tareas después de un tiempo determinado (opcionalmente de forma repetitiva) sin preocuparse por las fugas de memoria!

every-after es una biblioteca de Android para ejecutar una pieza de código (opcionalmente de forma repetitiva) después de cierto intervalo de tiempo. Expone funciones de extensión en LifecycleOwner para lograr esto.

Documentación

Función Descripción
LifecycleOwner.every(time, unit, action) Ejecuta action después de cada time en unidades unit. Ejemplo: time=2 unit=seconds implica cada 2 segundos
LifecycleOwner.everySecond(action)` ejecuta la acción cada segundo.
LifecycleOwner.everyMinute(action) Ejecuta la "acción" cada minuto
LifecycleOwner.after(time, unit, action) Ejecuta la acción una vez después del time en unidades unit

Cómo instalar

  1. En el nivel de proyecto build.gradle:

allprojects {
   repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
}
  1. En el nivel de aplicación build.gradle:

dependencies {
     implementation 'com.github.sidhuparas:every-after:1.1'
}

Ejemplo

Aquí tienes un ejemplo completo en Kotlin:

MainActivity.kt

package com.paras.everysample

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.paras.every.after.after
import com.paras.every.every
import com.paras.every.everyMinute
import com.paras.every.everySecond
import java.util.concurrent.TimeUnit

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val sec = everySecond { time ->
            log("1. $time")
        }

        everyMinute { time ->
            log("2. $time")
        }

        after(1, TimeUnit.MINUTES) {
            sec.cancel()
            log("3. Done")
        }

        every(1, TimeUnit.MINUTES) { time ->
            log("4. $time")
        }
    }

    private fun log(message: Any?) {
        Log.d("Every-After", message.toString())
    }
}

FAQ

  1. Puedo usar Handler para replicar la funcionalidad de la función after. ¿Por qué debería necesitar la función after o esta librería? Respuesta: El Handler es conocido por causar fugas de memoria cuando se usa sin cuidado. Con every-after, no es necesario ocuparse de cancelar la tarea si la actividad o el fragmento se destruyen. Se encarga automáticamente.
  2. **Respuesta: Sí, cada función devuelve un objeto que tiene implementada la interfaz Cancellable. Sólo tiene que llamar a la función cancel() para cancelar la tarea.
  3. No tengo acceso al objeto LifecycleOwner. Puedo cancelar la tarea por mi cuenta. ¿Puedo utilizar las funciones sin LifecycleOwner? Respuesta: Actualmente, no. Próximamente.

Referencia

Encuentre la referencia completa aquí.

Categorizado en:

Etiquetado en: