jok Posté(e) 22 mars 2014 Share Posté(e) 22 mars 2014 (modifié) 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 : 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é 24 mars 2014 par jok Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 24 mars 2014 Share Posté(e) 24 mars 2014 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é. 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
jok Posté(e) 24 mars 2014 Auteur Share Posté(e) 24 mars 2014 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 ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.