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.
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.
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 :
Toutes ses tâches sont exécutés automatiquement, il ne faut donc pas les appelés depuis notre Thread principal !!
Trois paramètres sont passés à la création de notre tâche asynchrone :
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.
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.
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.
TimeUnit | DAYS | |
TimeUnit | HOURS | |
TimeUnit | MICROSECONDS | |
TimeUnit | MILLISECONDS | |
TimeUnit | MINUTES | |
TimeUnit | NANOSECONDS | |
TimeUnit | SECONDS |
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 |
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