Ici et là, dans votre projet Android, vous avez tendance à avoir besoin de moyens pour exécuter du code de manière répétitive ou après une certaine période. Il y a le moyen standard d'utiliser la classe Handler, cependant cela peut conduire à des fuites de mémoire dans votre application. Dans cet article, nous allons examiner quelques solutions tierces faciles pour résoudre ce problème.
Questions auxquelles cet article répond
- Comment exécuter un morceau de code de manière répétitive ?
- Comment exécuter un morceau de code après une certaine durée ?
(a) Solution 1 : Utilisez la bibliothèque every-after
.
, une bibliothèque Android qui permet d'exécuter des tâches après un certain temps (éventuellement de manière répétitive) sans se soucier des fuites de mémoire !
every-after
est une bibliothèque Android pour exécuter un morceau de code (éventuellement de manière répétitive) après un certain intervalle de temps. Elle expose des fonctions d'extension sur LifecycleOwner pour y parvenir.
Documentation
Fonction | Description |
---|---|
LifecycleOwner.every(time, unit, action) |
Exécute action après chaque time en unit unités. Exemple : time=2 unit=seconds implique toutes les 2 secondes |
LifecycleOwner.everySecond(action) |
Exécute action toutes les secondes |
LifecycleOwner.everyMinute(action) |
Exécute l'action toutes les minutes |
LifecycleOwner.after(time, unit, action) |
Exécute action une fois après time en unit unités |
Comment installer
- Dans le fichier
build.gradle
du projet :
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Au niveau de l'application
build.gradle
:
dependencies {
implementation 'com.github.sidhuparas:every-after:1.1'
}
Exemple
Voici un exemple complet 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
-
Je peux utiliser
Handler
pour répliquer la fonctionnalité de la fonctionafter
. Pourquoi aurais-je besoin de la fonctionafter
ou de cette bibliothèque ? Ans : Handler est souvent connu pour provoquer des fuites de mémoire lorsqu'il est utilisé sans précaution. Avec every-after, vous n'avez pas besoin de vous occuper de l'annulation de la tâche si l'activité ou le fragment est détruit. Cette tâche est automatiquement prise en charge. -
**Puis-je annuler des tâches par moi-même ? Réponse : Oui, chaque fonction renvoie un objet avec l'interface
Cancellable
implémentée. Il suffit d'appeler la fonctioncancel()
sur cet objet pour annuler la tâche. - Je n'ai pas accès à l'objet LifecycleOwner. Je peux annuler la tâche par moi-même. Puis-je utiliser les fonctions sans LifecycleOwner ? Réponse : actuellement, non. Prochainement.
Référence
Vous trouverez la référence complète [ici] (https://github.com/sidhuparas/every-after).