AsyncTask en Kotlin

Bonjour à tous ! Nouvelle semaine, nouvel article. Aujourd’hui je vais aborder les AsyncTask en Kotlin. Dans cet article nous verrons la signification d’une AsyncTask ,  je vous présenterai comment la mettre en place en précisant les méthodes à surcharger.

Dans cet article, je vais parler de la notion de thread.  Un thread c’est un processus léger, on dit également que c’est une unité de traitement. Il est souvent utilisé pour la programmation parallèle, lorsqu’on exécute plusieurs  tâches en même temps.

Qu’est-ce qu’une AsyncTask ?

  • C’est une tâche qui s’exécute de manière asynchrone indépendante du thread principal. Similitude avec la notion de Thread.
  • Une AsyncTask est souvent dédiée aux traitements longs pour éviter de ralentir le thread principal qui s’occupe de l’interface graphique.
  • Une AsyncTask peut interagir avec l’interface graphique et communiquer avec le thread principal.
  • Une tache asynchrone s’exécutera en parallèle des autres thread de façons différées. La tâche n’attend pas que les autres taches soient terminées pour se terminer (asynchrone).

La mise en place d’une AsyncTask

Dans l’article qui va suivre, je vais présenter vous des parties de code repris de l’application que j’ai créés spécialement pour l’article. L’application possède une interface avec un bouton, une imageView et une barre de progression. Lorsque l’utilisateur clique sur le bouton, l’application va venir lancer l’AsyncTask , faire évoluer la barre de progression avant d’afficher une image à l’écran.

Je pense que ça va être plus simple si je vous montre l’aperçut de l’application.

Prérequis pour une AsyncTask

Pour mettre en place une AsyncTask, il est nécessaire de créer une classe à part entière. Vous avez deux choix soit vous créer votre nouveau fichier avec votre classe. Soit vous l’englobez dans la classe de votre mainActivity. À noter si vous choisissez la seconde option je vous recommande de placer le mot-clé “inner” devant votre nouvelle classe afin qu’elle puisse accéder aux éléments de la classe englobante.

À partir de cette classe, héritez là de la classe AsyncTask (voir l’exemple, ci-dessous) :

image

Vous pouvez faire le choix  de modifier les différents types entre “<>”. Les méthodes qui vont suivre seront alors quelque peu modifiées.  Le premier paramètre va correspondre au type de la variable d’entrer de votre AsyncTask. Vous pouvez passer une variable externe à votre AsyncTask avec la méthode “execute “dans votre mainActivity (Nous la verrons plus tard dans la suite de l’article). Le deuxième paramètre va définir le type d’une variable qui va évoluer pendant l’exécution de la tâche asynchrone. Le dernier va correspondre au type de la valeur de retour, notre AsyncTask dans la configuration ci-dessus va nous renvoyer un String.

schéma asynstack

Hériter une classe nécessite, c’est surcharger ces méthodes. C’est-à-dire les redéfinir et leur implémenter du code.  Les méthodes à surcharger sont :

image

image

image

image

La méthode onPreExecute

La méthode onPreExecute est la première méthode à être appelé lorsqu’on lance l’AsyncTask. On l’utilise souvent pour initialiser nos composants, nos objets ou bien nos fonctions. Elle doit être surchargée même si vous en n’avez pas l’utilité.

onPreExecute
override fun onPreExecute() {
    super.onPreExecute()
    Toast.makeText(this@MainActivity,"Début du traitement",Toast.LENGTH_SHORT).show()
}

La méthode doInBackground

La fonction doInBackground est lancée à la suite de la méthode onPreExecute. C’est le cœur de notre tâche, elle est utilisée pour les traitements longs. Les instructions de cette méthode vont s’exécuter dans  un nouveau thread.

doInBackground
override fun doInBackground(vararg params: String?): String {
   for (i in 1..100)
   {
       Thread.sleep(50)
       publishProgress(i)
   }
    return "Fin du traitement"
}

Le type du paramètre “params”  de la méthode doInBackground,  doit forcément correspondre au  premier type de votre AsyncTask (“valeur d’entrée”). C’est avec cette variable qu’on va pouvoir interagir avec la valeur qu’on a mise en paramètre lorsqu’on a lancé la tache asynchrone (La fonction “execute” dans le mainActivity dans la suite de l’article).

Class AsynStack param1

doInBackground String param

Son type de retour doit forcément correspondre au  dernier type de votre AsyncTask (“valeur sortante”). À la fin, de cette méthode la valeur de retour est transmise à la méthode onPostExecute qui est la dernière à s’exécuter.

Class AsynStack param3

doInBackground retour String

La méthode onProgressUpdate

Cette méthode va s’exécuter en parallèle de la fonction doInBackground dans le thread principal (mainActivity). Lorsque la fonction publishProgress sera appelée dans la méthode doInBackground , elle commencera et se terminera au même instant que celle-ci.

onProgressUpdate
override fun onProgressUpdate(vararg values: Int?) {
    super.onProgressUpdate(*values)
    progressBar.progress = values[0]!!.toInt()
    monTextView.text ="chargement de l'image à "+values[0].toString()+"%"
}

Le type du paramètre “value”  de la méthode onProgressUpdate,  doit forcément correspondre au second type de votre AsyncTask (“valeur variante”). La variable va varier en fonction de la progression de la méthode doInBackground . Elle peut être utile dans une application, par exemple pour réaliser une barre de progression qui affiche le pourcentage de chargement.

Class AsynStack param2

onProgressUpdate values

La méthode onPostExecute

C’est la dernière à s’exécuter, elle se lance après la méthode doInBackground. La méthode onPostExecute vient clôturer l’exécution de l’AsyncTask.

onPostExecute
override fun onPostExecute(result: String?) {
    super.onPostExecute(result)
    image.setImageResource(R.drawable.oiseau)
    Toast.makeText(this@MainActivity,result,Toast.LENGTH_SHORT).show()
    button.isClickable = true
}

La méthode prend en paramètre la valeur “result” qui est transmise par la fonction doInBackground . Son type doit correspondre au type renvoyé par la méthode doInBackground. Il doit correspondre également au dernier type de l’AsyncTask (“valeur sortante”).

Class AsynStack param3

onPostExecute result

L’appel de AsyncTask dans notre Activity

pour appeller l’AsyncTask dans notre activity,  il faut créer une instance de notre classe c’est-à -dire initialiser notre objet. Une fois l’instance créée il faut appeler la méthode “execute” de notre instance. On peut lui passer en paramètre une variable avec laquelle notre l’AsyncTask pourra interagir.

onCreate
class MainActivity : AppCompatActivity() {

    lateinit var progressBar: ProgressBar
    lateinit var monTextView: TextView
    lateinit var image: ImageView
    lateinit var button: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        progressBar = findViewById(R.id.progressBar)
        monTextView = findViewById(R.id.textView)
        image = findViewById(R.id.imageView)
        button = findViewById(R.id.button)

        button.setOnClickListener {  val monAsynStack : MonAsynStack = MonAsynStack()
            monAsynStack.execute("Enfin!")
            image.setImageResource(0)
            button.isClickable = false
        }

    }

Pour aller plus loin

cube_en_boisIl existe les librairies Glide, Picasso pour charger des images sur le net. Ces    librairies peuvent être utiles, si vous avez comme moi une application qui vient afficher des images à l’écran.

Picasso et Glide
override fun onPostExecute(result: String?) {
    super.onPostExecute(result)
    val rand = Random()
    when (rand.nextInt()) {
        0 -> {Glide.with(this@MainActivity)
            .load("https://cdn.pixabay.com/photo/2016/04/18/10/17/wolf-1336229_1280.jpg")
            .into(image)}
        1 -> {Picasso.get()
            .load("https://cdn.pixabay.com/photo/2016/06/13/15/07/presentation-1454403_1280.png")
            .into(image)}
        else -> {image.setImageResource(R.drawable.oiseau)}
    }
    Toast.makeText(this@MainActivity,result,Toast.LENGTH_SHORT).show()
    button.isClickable = true
}

La librairie Anko  que je vous avais déjà introduite dans un précédent article “AlertDialog en Kotlin”, peut-être utilisé avec les AsyncTask et ainsi simplifier et réduire le nombre de lignes de code de votre application.

Merci d’avoir lu ! Maintenant, si vous avez aimé le contenu de l’article, si  vous connaissez une personne à qui cet article peut intéresser, n’hésitez pas à le liker et à le partager sur les réseaux sociaux. Si vous souhaitez me faire part de vos remarques, de vos problèmes, de vos suggestions de prochain article ou tout simplement de votre soutien n’hésitez pas à m’en faire part dans les commentaires, je vous en remercie.

Crédit photo : Blickpixel, openClipart-vector

Partager l'article :
  •  
  •  
  •  
  •  
  • 6
    Partages

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *