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 thread attente par boucle while


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Problème thread attente par boucle while
    Bonjour à tous,

    Voilà j'ai actuellement ce code
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    dialogChargement = ProgressDialog.show(ListeReponses.this, "", getString(R.string.chargement), true, true, new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    threadConnexion.interrupt();
                }
            });
            threadConnexion = new Thread(new Runnable() {
                public void run() {
     
                    unJSONArray[0] = uneConnexionHTTP.chercherREP(uneIdentification.getPseudo());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                for (int i = 0; i < unJSONArray[0].length(); i++) {
                                    JSONObject jsonLigne = unJSONArray[0].getJSONObject(i);
                                    String pseudo = jsonLigne.getString("PSEUDOEXP");
                                    String MSG = jsonLigne.getString("DATE");
     
                                    HashMap<String, String> map = new HashMap<String, String>();
                                    map.put("id", String.valueOf(i));
                                    map.put("pseudo", pseudo);
                                    map.put("MSG", MSG);
                                    listItem.add(map);
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    dialogChargement.dismiss();
                    b[0] = false;
                }
            });
            threadConnexion.start();
     
            while(b[0])
            {
     
            }
    Le problème c'est que je veux que la boucle while s'arrête quand le runOnUiThread fini en mettant b[0]=false; après le try/catch, et quand je fais ça l'application ne répond plus et je ne sais pas pourquoi.

    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ta boucle while ne s'arrête pas probablement parce que b[0] reste à true. Que fait au juste ta méthode runOnUIThread() ? Et dismiss() de ProgressDialog ? Vérifie que le b[0]=false; est exécuté en ajoutant par exemple un System.out.println("b[0]="+b[0]);. juste après. D'ailleurs, es-tu bien sûr qu'il s'agisse de la même instance de tableau dans les deux méthodes ?

    Il est possible également que le changement de valeur de b[0] dans le thread ne soit pas vu par l'autre thread qui exécute la boucle while : sans rentrer dans les détails, il y a un système d'optimisation de Java qui procède parfois à une copie de valeur (voir notion de Memory Consistency Errors). On peut régler ça avec le mot clef volatile, mais on ne peut pas faire un tableau de volatiles. On peut utiliser un AtomicXXXArray (ou XXX est le type) pour avoir un tableau d'élements volatiles, mais il n'existe pas de AtomicBooleanArray. Toutefois, dans ton cas tu peux utiliser un AtomicBoolean à la place, puisque tu n'a qu'une seule valeur. Essayes de remplacer ton tableau par un AtomicBoolean pour voir.

    Par ailleurs, la méthode interrupt() n'arrête en aucun cas un thread. Elle change un état qui provoque la levée d'un InterruptedException sur des méthodes d'attente telle que Thread.sleep(), ou Object.wait().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  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
    Change ton implémentation et utilise un pattern observer, soit via un Handler, soit via un système d'interface.
    C'est plus propre, plus compréhensible, ce n'est pas de l'attente active et ça ne crame pas la batterie du terminal (sans compter la chaleur qui sera dégagée).
    Avec ton attention active, tu exécute en continu ta boucle, quoi qu'il se passe, d'où ton "Application not responding".

    @joel.drigo : la méthode runOnUiThread() est une built-in d'Android, qui porte bien son nom : elle permet d'exécuter une portion de code sur le thread graphique. Sur Android, l'interface graphique ne peut être modifiée QUE dans le thread graphique, et dans aucun autre.
    dismiss() est une autre built-in concernant les popup, qui permet de les faire disparaître.
    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
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Hizin Voir le message
    @joel.drigo : la méthode runOnUiThread() est une built-in d'Android, qui porte bien son nom : elle permet d'exécuter une portion de code sur le thread graphique. Sur Android, l'interface graphique ne peut être modifiée QUE dans le thread graphique, et dans aucun autre.
    dismiss() est une autre built-in concernant les popup, qui permet de les faire disparaître.
    J'avais pas fait attention qu'il s'agissait d'une question Android. Je me doutais bien de ce qu'elle faisait, mais n'étant pas standard en Java, je ne pouvais être sûr de comment.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    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
    Pas de souci
    La question a été posée, et elle a simplement été répondue
    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

Discussions similaires

  1. Problème / bug dans une boucle while
    Par Armad dans le forum Scilab
    Réponses: 1
    Dernier message: 08/09/2014, 22h37
  2. problème avec simpleXML et boucle while
    Par mawkli dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2012, 16h08
  3. problème champ texte dans boucle while
    Par merlubreizh dans le forum Langage
    Réponses: 7
    Dernier message: 10/08/2011, 19h28
  4. Problème .destroy() dans une boucle while !
    Par stuffy dans le forum Tkinter
    Réponses: 1
    Dernier message: 29/06/2008, 01h30
  5. Problème condition d'arrêt boucles while et for
    Par Clairette29 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/06/2008, 11h51

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