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

  1. Comment exécuter un morceau de code de manière répétitive ?
  2. 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

  1. Dans le fichier build.gradle du projet :

allprojects {
   repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
}
  1. 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

  1. Je peux utiliser Handler pour répliquer la fonctionnalité de la fonction after. Pourquoi aurais-je besoin de la fonction after 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.
  2. **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 fonction cancel() sur cet objet pour annuler la tâche.
  3. 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).

Catégorisé: