Sur Android vous utilisez les AsyncTasks pour vos opérations longues?

STOP!!!!!!!!!!

J'ai mieux!!!! Pourquoi?

Parce-que les AsyncTasks ne sont pas sans défaut, loin de là. Cette article l'explique très bien. Certes l'utilisation des AsyncTasks est simple, mais pourquoi s'embéter avec celles-ci si vous pouvez utiliser quelques choses de plus simple encore et beaucoup plus efficace?

Que faire alors ? Utiliser l'excelente library:

Path

couplé avec un event bus comme celui de GreenRobot, c'est juste excellent!

Un exemple d'utilisation:

La rotation de l'écran sous Android, déclenche la destruction de l'activity courante (une erreur d'architecture logiciel je trouve...). Cette destruction de l'activity provoque à son tour la perte des AsyncTasks en cours de fonctionnement lors de la rotation. A partir de la, le plus souvent les AsyncTasks continuent leur travail inutilement car incapable de fournir leurs résultats (Cela peut bien se passer si l'AsyncTask est correctement mise en place, mais cela demande plus de travail et n'empêche pas toujours les fuites de mémoire).

Voila un lien d'exemple, traitant se cas avec la library.

Comment l'utiliser:

  • importer le projet dans Android Studio
  • faîte une synchronisation des library avec gradle
  • lancer le projet

Le projet de démo, simule une opération longue (à L'appui sur le premier bouton, l'application va chercher le code source de la page google.fr cela après un temps d'attente de 2 secondes pour simuler un temps de traitement.).
Essayer l'application, puis recommencer en modifiant l'orientation de votre terminal pour voir que le résultat est identique.

Traduction rapide des bons points de Path:

  • permet de de-coupler la logique de l'application concernant les activity, rendant ainsi le code plus robuste, facile à refactoriser et simple à tester.

  • permet de ne pas avoir à s'embéter avec le cycle de vie de l'AsyncTask, si vous utilisez un event bus pour mettre à jour votre UI (vous devriez). Path, fonctionne très bien avec EventBus de greenRobot, mais fonctionne aussi avec les autres(ex: Otto)

  • Path s'occupe de prioriser les tâches, de les faires fonctionner en parallèle, vérifier la connexion internet, etc. La priorisation des tâches est indispensable quand vous avez une application gourmande en ressource!

  • vous pouvez retarder le lancement des tâches. C'est utile dans certain cas comme l'envoi d'un token à votre serveur push. Il est très courrant
    d'obtenir un token gcm et de l'envoyer au serveur quand l'utilisateur se connecte dans l'application, mais vous ne voulais pas que cela interfére avec les opérations prioritaire nécessitant une connexion internet (exemple la récupération de la phhoto de profile).

  • Vous pouvez grouper les tâches pour vous assurer de leur exécution en série, si nécessaire. Par exemple, assumons que vous avez un client de messagerie instantanné et que votre utilisateur veut envoyer une série de messages lorsque son téléphone à pardu sa connexion internet. Quand vous créer ces jobs SendMessageToNetwork , vous pouvez le grouper par id de conversation. Par cette approche, les messages d'une même conversaqtion seront envoyer dans l'ordre où ils ont étaient mis à la file, pendant que les messages des différentes conversations seront envoyé en parallèle. Cela vous permez de maximiser votre utilisation du réseau avec le moin d'effort possible tout en s'assurant de l'intégrité des données.

Par défaut, le manager de file d'exécution s'occupe de la connectivité (vous n'avez pas besoin de vous en occuper). Quand l'appareil fonctionne en hors connexion, les jobs qui nécessite une connexion ne seront pas exécuter tant que la connexion n'est pas restauré. Vous pouvez aussi utiliser votre propre implémentation de la classe NetworkUtil si vous devez suivre une logique spécifique à votre utilisation(ex: vous pouvez créer une autre instance du manager d'exécution des tâches qui les exécutera que si la connexion est une connexion sans file).

La library à passé des tests unitaires et est presque totalement documenté. Vous pouvez consulter ses tests et la Javadoc.