IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème arrêt d'AsyncTask


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Problème arrêt d'AsyncTask
    Bonjour à tous,

    J'utilise un AsyncTask pour faire un traitement sur une image capturé à l'aide de l’appareil photo. Mon traitement se résume à un seul appel de fonction (pour information j'appel ma fonction decode(image,dimx,dimy)).

    J'utilise vos tutoriels Android pour m'aider particulièrement celui-ci :
    Thread, Handler , AsyncTask et fuite mémoire.

    Dans ce tutoriel est expliqué que lorsque l'AsyncTask est passer dans la fonction postExecute() (c-a-d qu'il a terminer le traitement de DoInBackground()) le thread de l'AsyncTask est killer.
    Sauf que voila, quand je vais dans le DDMS d'eclipse et que je regarde les threads, mon AsyncTask est encore là avec le statut wait. Et si je relance mon traitement je vais créer un autre AsyncTask sans supprimer l'ancien.

    Dans le tutoriel est donné un exemple qui traite un problème de "fuite mémoire" sauf que quand je lance le programme qui est fournis par le tutoriel je me retrouve avec le même problème d'AsyncTask non arrêté et quand on relance le programme un autre AsyncTask est créé sans supprimer l'ancien.

    Est-ce que c'est normal ? J'ai quelques données membres pour mon AsyncTask est-ce que sa ne serait pas sa mon problème : "mes données ne sont pas détruite donc mon AsyncTask ne peut pas se terminé ?

    Je vais rechercher ce que veut dire le statut wait mais je tenais à avoir vos avis.

    Merci d'avance pour vos futures réponses.

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Très bonne question que je me pose aussi.
    J'ai remarqué la même chose mais en utilisant le debugger : les AsyncTask restent (avec l'état running en plus) lorsque leur "exécution" est sensé être terminée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread [<10> AsyncTask #2] (Running)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    J'ai eu beau chercher sur le net tout le monde dis que quand DoInBackground() est terminé, le thread est killer sauf que ... ben non !

    Alors il est possible que sa soit normal (pour toi les AsyncTask sont en mode running alors que moi ils sont en mode wait) mais j'aimerais bien pouvoir trouver une justification au fait de laisser vivant un AscynTask "fantôme".

    L'asyncTask est censé simplifié l'utilisation des threads mais finalement si on ne peut pas l'arrêter manuellement lorsque la tâche est effectuer autant utilisé des TimerTask (pour la simplicité d'utilisation) ou directement un thread avec handler.

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je n'ai pas regardé le code des AsyncTask en détail... mais en général la construction de l'environnement nécessaire à un AsyncTask est lent (Handler, Registrations, création du thread d'execution, ...).

    Il est fort à parier que tous ces objets sont "cachés" (et le même worker thread utilisé pour plusieurs async-task). Si c'est le cas, le worker-thread est un daemon qui n'empêchera donc pas l'arrêt de la JVM. Mais il se peut qu'il conserve un pointeur sur le dernier AsyncTask executé...

    Dans tous les cas ce n'est pas bien grave, il n 'y a aucun "membre" qui référence le contexte, donc peu de chance d'avoir des fuites de mémoire.
    Sauf en cas de surcharge, mais là, on sait ce qu'on fait.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Allez... je suis allé voir le code vu que ca me tarabustait...

    Donc conformément à ce que je disais, AsyncTask est parfaitement intelligent, et crée des worker-threads (executors) à la demande, avec un "pool" d'executors....

    Rien de parfaitement normal donc que les threads restent dans le coin...
    Par contre, je ne comprends pas vraiment pourquoi les objets AsyncTask resteraient en mémoire.

    Edit: Oups, mais non en fait vous parlez des Threads... et c'est normal qu'ils ne soient pas détruits afin d'être réutilisés si besoin...
    Je rappelle que la construction d'un thread est un truc super lent (allocation de pile, préparation du garbage-collector, etc...).
    Tant que les objets AsyncTask sont bien détruits, on se fiche un peu que les threads soient toujours présents....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Ok, merci pour ta réponse et les petites informations bonus =)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci pour ta réponse tout d'abord.

    Mais si le thread reste en mémoire comment le réutilisé sans recréé un autre thread "AsyncTask" puisqu'on ne peut lancer un AsyncTask qu'une seul fois j'aimerais savoir comment serait-il possible de pouvoir réutiliser ce même thread plutôt que d'en recréé un ?

    Est ce que la technique décris dans cette page qui permet de vérifier si le thread existe pour le réutiliser serait applicable dans mon problème c'est-à-dire pour un AsyncTask.

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Tous les AsyncTask partagent le même pool de threads !

    Donc a chaque fois que vous instanciez un AsyncTask, il va prendre un des threads déjà créés !

    Encore une fois, l'objet AsyncTask ne sert que comme "pilote" de ces executors, et sont bien "oubliés" une fois la tache finie. Les threads eux restent dispo pour d'autres AsyncTask
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    En effet, il semblerait que lorsqu'on atteint les 5 threads "AsyncTask" l'application arrête d'en créer et doit réutiliser les anciens (je parle au conditionnel parce que les threads reste en mode wait, mais dans mon programme test je fais un traitement très légers, je vais l'alourdir).

    Dés que j'en ai la certitude vous serez les premiers informé !

    Merci encore pour ta réponse !

    Edit : C'est bon je viens de faire le test j'ai simplement rajouter une pause de mon thread dans la fonction doInBackground() de manière à vérifier avec le DDMS que je réutilise bien mes anciens threads et c'est bien le cas une fois qu'on a créé 5 threads après avoir utilisé le dernier on réutilise le premier puis le second et ainsi de suite.

    Merci encore !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème arrêt de certains thread dans une application
    Par adteulade dans le forum Android
    Réponses: 7
    Dernier message: 24/04/2012, 10h22
  2. Problème arrêt de threads
    Par Swandyr dans le forum Général Python
    Réponses: 0
    Dernier message: 09/02/2012, 11h42
  3. Problème arrêt d'une application java en windows services
    Par Estelle_32 dans le forum Général Java
    Réponses: 6
    Dernier message: 20/10/2010, 11h52
  4. Problème arrêt JBoss
    Par SkyDev dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 15/02/2008, 00h10
  5. Problème arrêt/démarrage Oracle
    Par kryst dans le forum Oracle
    Réponses: 1
    Dernier message: 06/10/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo