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 :

Attendre la fin d'une AsyncTask


Sujet :

Android

  1. #1
    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 Attendre la fin d'une AsyncTask
    Bonjour,

    Je sais que d'un côté, une asynctask est faite pour ne "pas être syncronisé", mais est-il possible d'attendre la "fin" d'une asynctask ?

    Je m'explique plus en détails.
    Actuellement, pour ouvrir démarrer une activity, j'ai besoin de récupérer des données sur 4 pages web différentes.
    Jusqu'à maintenant, je n'avais qu'une asynctask qui traitait une page, puis l'autre... Mais, ne serait-ce pas mieux, plus rapide, d'avoir une asynctask par page (ou alors, deux qui traitent deux pages) ?
    Le problème, c'est que je ne vois pas (peut-être que ce n'est pas possible) comment faire une asynctask "principale" qui lance les trois autres, et attends leur fin pour continuer.


    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Je sais qu'en JAVA, les thread adoptent les méthodes notify(), notifyAll(), wait() pour indiquer justement qu'un Thread a terminé son execution que qu'un autre peut continuer.

    Après je ne sais pas comment ça s'applique aux aSyncTask, mais peut être que ça peut t'aiguiller...

  3. #3
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Tu invoque la méthode qui va bien dans le onPostExecute() de ton AsyncTask ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  4. #4
    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
    Citation Envoyé par Anduriel Voir le message
    Je sais qu'en JAVA, les thread adoptent les méthodes notify(), notifyAll(), wait() pour indiquer justement qu'un Thread a terminé son execution que qu'un autre peut continuer.

    Après je ne sais pas comment ça s'applique aux aSyncTask, mais peut être que ça peut t'aiguiller...
    J'y ai pensé aussi, un "join" aurait été sympatique.
    Il faudrait qu'à la fin de l'asynctask principale, il y ai autant de wait que d'asynctask du coup. Et je ne sais pas ce qui se passerait si une asynctask "secondaire" se termine avant que l'ascyntask principale n'éxécute le wait. (Il y a aussi des requêtes http dans l'asynctask principale).



    Citation Envoyé par Hizin
    Tu invoque la méthode qui va bien dans le onPostExecute() de ton AsyncTask ?
    Je redéfini cette onPostExecute() pour m'en servir, mais je ne vois pas de quelle méthode à invoquer tu parle par contre.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 64
    Points : 71
    Points
    71
    Par défaut
    Il me semble que tu peux faire un truc du genre:

    depuis l'UIThread. Ca te retourne le résultat de l'asynctask lorsqu'elle est terminée

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je pensais à un truc : passer l'objet à l'AsyncTask, et à chaque onPostExecute, un appel à une méthode de la classe appelante "isAsyncFinish()" qui vérifie combien d'AsyncTask ont appelé la méthode, et soit incrémente le nombre d'appel, soit fait la suite.

    EDIT : Mais la solution proposée par Arno5788 est largement mieux, le get() attendant que l'AsyncTask se termine.

    Documentation : http://developer.android.com/referen...html#get%28%29
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  7. #7
    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
    Faut vraiment que j'arrête de lire en diagonale la documentation, j'ai sauté cette méthode en voyant son nom (get, pas très parlant par rapport à un join, mais c'est finalement compréhensible vu que ça retourne la valeur en même temps).

    Merci pour vos réponses, je vais tester ça dès demain.

  8. #8
    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, ça marche parfaitement. Merci pour vos réponses

    Mais juste une dernière petite question en passant : pendant un petit laps de temps, il va y avoir 4 asynctasks exécutées simultanément. Il n'y a pas de risque que ça plante si une ou deux petites asynctask "se ramènent par hasard" ?

  9. #9
    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
    "Par Hasard" ?

    Je ne sais pas par hasard... mais ce qui est sur c'est que les AsyncTask ne sont pas des threads. Ce sont des "taches" (task) qui seront exécutées de manière asynchrone par un pool de threads quelque part (en fait, il semble que le pool soit par défaut de 5 threads au maximum).

    Le corollaire est que:
    * On peut avoir autant de AsyncTask qu'on veut cela ne créera pas autant de thrads.
    * Les AsyncTask ne s'executent pas forcément en parallèle.

    Donc à mon avis, la bonne manière de procéder est de remplir une liste de "AsyncTask" à attendre, et de la vider au fur et à mesure...
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    ArrayList<AsyncTask> taskLists = new ArrayList<AsyncTask>();
    public void onStartTasks()
    {
        showProgress(); // <= pour indiquer qu'on va attendre...
        taskLists.add(...); // <= ajout des tasks chaque task va faire un appel à onTaskFinished(this); dans le postExecute()
    }
    public void onTaskFinished(AsyncTask task)
    {
       taskLists.remove(task); // <= pas besoin de synchronization on est dans le UI thread
       if (taskLists.isEmpty()) {
           hideProgress();
           startActivity(...);
           finish();
       }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    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
    Citation Envoyé par nicroman Voir le message
    "Par Hasard" ?
    Il est possible qu'il y est une cinquième asyntask de l'application qui soit en train de se terminer (si l'utilsateur "fonce" dans cette activity à la première utilisation, et possède une connexion très lente).
    Et sur le coup, j'avais pensé au cas où l'utilisateur cliquerais sur le bouton "Home" pour lancer une application en même temps ^^


    Mais ton explication suivante est assez claire et très intéressante sur les threads et asynctask, merci bien.

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

Discussions similaires

  1. Attendre la fin d'une AsyncTask
    Par Fuotmad dans le forum Android
    Réponses: 1
    Dernier message: 22/05/2015, 11h45
  2. Attendre la fin d'une popup
    Par maxattack dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 03/07/2007, 21h27
  3. [JFrame] Attendre la fin d'une autre fenêtre
    Par nicolas.pied dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/12/2005, 09h14
  4. Attendre la fin d'une action
    Par ederoeck dans le forum Access
    Réponses: 3
    Dernier message: 24/09/2005, 08h36
  5. [FLASH MX2004] Attendre la fin d'une anim
    Par stailer dans le forum Flash
    Réponses: 2
    Dernier message: 11/07/2005, 12h47

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