Mise en place d'une tâche asynchrone

Mise en place d'une tâche asynchrone

La création d'une tâche asynchrone est primordiale lors de l'implémentation de long traitement. Ceux-ci peuvent nuire fortement à l'expérience utilisateur à cause des blocage occasionnés. Présentation et utilisation de la classe AsyncTask.

Présentation

Une tâche asynchrone permet de réaliser des traitements plus ou moins long sans bloqué l'interface utilisateur. Elle permet même d'informer l'utilisateur de l'avancer du traitement.

 

Utilisation

La classe AsyncTask doit étendre une classe JAVA :

Exemple de la doc officielle : lien

Par défaut, elle implémente 4 méthodes s'exécutant à différent moment pendant son exécution :

  1. onPreExecute() est exécuté avant que la tâche soit exécuté. En général elle est utilisé pour configurer notre tâche asynchrone.
  2. doInBackground(Param..) est exécuté immédiatement après la méthode précédente. C'est dans cette méthode que le traitement est exécuté et dont la durée peut être longue. On peut récupérer des paramètres dans cette méthode ainsi que retourné l'avancé de la tâche avec la méthode publishProgress(Progress...).
  3. onProgressUpdate(Progress...) est executé lors de l'appel de la fonction publishProgress(Progress...). En général elle est utilisé pour avertir l'utilisateur de l'avancer de la tâche, par exemple avec une barre de progression.
  4. onPostExecute(Result) est exécuté lorsque le traitement est terminé. En genéral c'est le moment de la publication du résultat.

Toutes ses tâches sont exécutés automatiquement, il ne faut donc pas les appelés depuis notre Thread principal !!

 

Paramètres

Trois paramètres sont passés à la création de notre tâche asynchrone :

  1. Le type du péramètre pour la fonction doInBackground(Param..)
  2. Le type de donnée publié durant le traitement (passer en paramètre par publishProgress(Progress...) et utilisé par onProgressUpdate(Progress...)).
  3. Le type du résultat retourner par doInBackground(Param..)

 

Exécution

Pour exécuter notre tâche asynchrone, il suffit d'executer notre tâche dans un Thread de notre UI :

Il suffit de créer d'instancier notre classe et d'appeler la méthode execute en lui passant les paramètre nécessaire à notre doInBackground.

 

Annulation

Pour annuler en cours de traitement notre tâche, il suffit d'appeler la méthode cancel(boolean). Cette méthode va par conséquence permettre à la méthode isCancelled() de retourner true. Ensuite à la fin du traitement de doInBackground(Param..) la méthode onCancelled(Object) sera exécuté au lieu de onPostExecute(Object).

Pour une annulation plus rapide il est conseillé d'appeler la méthode isCancelled() autant que possible au cours de notre traitement doInBackground.

Dans l'exemple de la documentation officielle, la méthode isCancelled() est appelé à chaque tour de boucle et s'il retourne true alors l'instruction break; est appelé pour quitter la boucle.

 

 

Attente du résultat

Il est possible d'attendre le résultat retourner par la tâche asynchrone avec la méthode get().

On peut passer deux paramètres à la méthode get qui permettent de donnée une durée maximum d'attente avant l'annulation de la tâche.

  1. Le premier paramètre est une valeur
  2. Et le deuxième correspond à l'unité de durée :
TimeUnit  DAYS   
TimeUnit  HOURS   
TimeUnit  MICROSECONDS   
TimeUnit  MILLISECONDS   
TimeUnit  MINUTES   
TimeUnit  NANOSECONDS   
TimeUnit  SECONDS 

 

Récupération du status

La méthode getStatus() permet de récupérer le status de notre tâche asynchrone :

Trois valeurs de retour possible :

Valeur de l'enum
AsyncTask.Status  FINISHED  La méthode onPostExecute(Result) est terminé. 
AsyncTask.Status  PENDING  Pas encore exécuté
AsyncTask.Status  RUNNING  Tâche en cours d'exécution

 

Pour finir

Un exemple d'implémentation de tâche asynchrone est présent sur le site dans le projet listVewJson et est implémenté dans la partie 2.

Le code présenté en début d'article provient de la documentation officielle d'Android