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***
- Como executar um pedaço de código repetidamente?
- 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
- No nível de projeto
build.gradle
:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- 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
-
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. -
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. - 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.