Aller au contenu

[RÉSOLU] Gestion des cycles d'une activité avec AsyncTask


jok

Recommended Posts

Bonjour,

 

Je suis en train de développer une application qui nécessite le téléchargement d'un fichier. Voici les premières étapes de l'application :

- Lancement de l'application,

- Un SplashScreen apparaît avec une ProgressBar téléchargeant le fichier (utilisation de AsyncTask),

- Une fois le fichier téléchargé, une deuxième Activity chargeant le fichier apparaît (mais vous allez voir que mon problème apparaît avant).

 

En fait, je fais fasse à un problème qui arrive en fonction du cycle de vie de l'application.

 

Quand on met l'application en arrière plan (pour retourner sur le bureau ou pour lancer une autre application par exemple) l'application fait :

- onPause() quand je reviens sur le bureau

- onResume() se déclenche quand je reviens dessus rapidement, et ma ProgressBar revient à son état normal. Jusque là tout va bien.

 

Mais quand on met l'application en arrière plan trop longtemps lors du téléchargement du fichiers (qui prend quand même quelques minutes), l'activité de l'application se réinitialise malgré le fait que le thread continue à s'exécuter. Hors, comme on passe par un nouvel onCreate, la vue se réinitialise mais un nouvel AsyncTask est aussi lancé, et mon fichier se télécharge donc deux fois. Pour résumer, ça fait ça :

- onPause() quand je reviens sur le bureau,

- onStop() se déclenche quand je reviens dessus après un certain temps (A noter que ce temps est différent selon mes deux tablettes : Samsung Galaxy Tab 10" et Nexus 7", et ce temps dépend apparemment de la mémoire disponible pour les autres applis)

onRestart()

- onCreate() relance un nouvel AsyncTask chargé de télécharger le fichier une deuxième fois.

 

 

Petit rappel sur le cycle de vie d'une application :

 

322141.png

 

Ma question : Est-ce possible de récupérer l'état d'un AsyncTask existant malgré le fait que l'application repasse par le onCreate après un certain temps ?

 

Le but est en effet qu'au retour sur l'application, je récupère l'état de ma ProgressBar en cours sans relancer un deuxième AsyncTask.

 

Si vous avez besoin de détails supplémentaires, n'hésitez pas (je ne mettrai le code que si c'est vraiment nécessaire vu qu'il est assez conséquent).

 

Merci d'avance pour votre aide !

Modifié par jok
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Faire gérer le téléchargement par ton Activity n'est pas la solution. Comme tu as pu le remarquer ,tu n'as pas la maîtrise du cycle de vie de celle-ci, et de ce fait, la gestion d'une tâche asynchrone est plus qu'ardue dans ce cas.

Mais il existe un autre composant dans Android, plus adapté pour gérer des traitements qui ne doivent pas être liés à la présence à l'écran de ton application. Il te faut donc plutôt implémenter un Service, qui se chargera de lancer l'AsyncTask de téléchargement (et c'est ton Activity qui démarrera le Service).
Et puisque ton traitement long asynchrone est un téléchargement, tu peux aussi t'appuyer sur Android, qui propose un DownloadManager, qui se chargera de faire le téléchargement (et de gérer la reprise sur erreur éventuellement), que ton application soit encore présente à l'écran ou non. En fin de téléchargement, tu seras notifié.

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Merci pour ces détails ! Je vais me pencher sur ces deux manières de faire et voir laquelle correspond le mieux à mon projet du coup.

 

C'est étrange que beaucoup de tutoriels proposent le téléchargement avec AsyncTask alors que selon le device utilisé, le comportement peut être totalement différent et donc faire buguer l'application si on ne prend pas en compte le cycle de vie des Activity...

 

Encore merci !

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...