Aqui e ali, em seu projeto andróide, você tende a precisar de maneiras de executar o código repetidamente ou após um certo período. Há a maneira padrão de usar a classe Handler, porém isto pode levar a vazamentos de memória em seu aplicativo. Neste artigo, veremos algumas soluções fáceis de terceiros para este problema.

**Questões Este artigo responde***

  1. Como executar um pedaço de código repetidamente?
  2. Como executar um trecho de código após uma certa duração?

(a) Solução 1: Utilize "sempre-após".

Biblioteca Android para executar tarefas após determinado tempo (opcionalmente de forma repetitiva) sem se preocupar com vazamentos de memória!

A "sempre-após" é uma biblioteca Android para executar um pedaço de código (opcionalmente de forma repetitiva) após um determinado intervalo de tempo. Ela expõe funções de extensão no LifecycleOwner para conseguir isso.

Documentação

Função Descrição
'LifecycleOwner.every(time, unit, action) Executa 'ação' após cada 'tempo' em unidades de 'unidade'. Exemplo: time=2 unit=seconds implica a cada 2 segundos
LifecycleOwner.everySecond(action) Executa ação a cada segundo
LifecycleOwner.everyMinute(action) Executa ação a cada minuto
LifecycleOwner.after(time, unit, action) Executa action once after time in unit units

Como instalar

  1. No nível de projeto build.gradle:

allprojects {
   repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
}
  1. Em nível de aplicação build.gradle:

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

Exemplo

Aqui está um exemplo completo em 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. Posso utilizar o Handler' para replicar a funcionalidade da função depois'. Por que eu deveria precisar da função "depois" ou desta biblioteca? Ans: Sabe-se que o "Handler" muitas vezes causa vazamentos de memória quando utilizado de forma descuidada. Com o "depois", você não precisa se preocupar em cancelar a tarefa se a atividade ou fragmento for destruído. É automaticamente tomado cuidado.
  2. Posso cancelar tarefas sozinho? Ans: Sim, cada função retorna um objeto que tem uma interface "cancelável" implementada. Basta chamar a função "cancelar()Cancelar() para cancelar a tarefa.
  3. Não tenho acesso a objetos do LifecycleOwner. Eu posso cancelar a tarefa por conta própria. Posso utilizar as funções sem o LifecycleOwner? Ans: Atualmente, não. Em breve.

Referência

Encontre a referência completa aqui.

Categorized in: