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 Threads meurent tout seuls


Sujet :

Android

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Problème Threads meurent tout seuls
    Bonjour,

    J'ai fait une application Android MT avec un thread principal qui lance l'activité et affiche la fenêtre avec un bouton Démarrer, un bouton Arrêter et un bouton préférences.
    Lors du clic sur le bouton démarrer, le thread principal lance deux autres threads, un qui fait des connexion http/https pour récupérer des infos et un autre qui envoie les coordonnées GPS toutes les 5 minutes.

    Mon problème est que les threads HTTP et GPS se coupent au bout d'un moment alors qu'ils sont dans une boucle while(monBooleen) avec monBooleen = true et qui est mis avec la fonction setMonBooleen() à false lorsqu'on appuie sur le bouton Arrêter.

    Je sais que mes threads se coupent car j'ai mis un bouton qui s'affiche que si la variable threadGPS est différente de null, ce qui est le cas quand on appuie sur arrêter et pareil pour la variable threadHTTP.

    Code du bouton démarrer: lm est un Location manager
    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
    bouttonDemarer.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    start=true;
                    DELAI_GPS=Integer.parseInt(preferences.getString("GPS", "5"))*60000;
                    locationNEW=null;
                    locationOLD=null;
                    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, DELAI_GPS,DISTANCE_MIN_GPS, onLocationChange);
                    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, DELAI_GPS,DISTANCE_MIN_GPS,onLocationChange);
                    if(threadHTTP!=null){threadHTTP.start();}
                    else{threadHTTP= new monThreadHTTP(); threadHTTP.start();}
                                            if(threadGPS !=null){threadGPS .start();}
                        else{threadGPS = new monThreadGPS(); threadGPS.start();}
                    }
     
                }
            });
    code du bouton arrêter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bouttonArreter.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    if(threadHTTP!=null){threadHTTP.setRunning(false);threadHTTP=null;}
                    if(threadGPS !=null){threadGPS .setRunning(false);threadGPS =null;}
                }
            });
    et les code des deux threads sont sur le même principe :
    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
    private class monThreadGPS extends Thread implements Runnable{
                    private Boolean isRunning=false;
                public void run(){
                    isRunning=true;
                    while(isRunning){
                        //TRAITEMENT
                                    sleep(DELAI); //DELAI = 5 minutes
     
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                //Méthode pour arrêter le THREAD
                public void setRunning(boolean isRunning){
                    this.isRunning=isRunning;
        }
    J'ai fait plusieurs tests avec le même téléphone :
    Si je reste sur place avec le téléphone connecté à Eclipse je n'ai pas encore eu ce problème.
    Si je mets le téléphone dans une voiture et que je le suis "à la trace" par moment ça fonctionne très bien mais je ne sais pas pourquoi, il arrive que les threads se coupent, comme expliqué plus haut.

    Merci de votre aide

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Bonsoir,

    je n'ai pas les connaissances pour répondre à ta question. Cependant, je me demande juste pourquoi tu ne fais pas un service à la place de ton threadGPS ?

    bonne soirée,
    Factor22

  3. #3
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut
    Si le problème arrive uniquement lors de déplacement, il faut peut être voir si une coupure réseau ou GPS ne coupe pas tes threads.
    Applications et jeux gratuits sur http://www.kamaxandroid.com

  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
    Salut !

    Il y a deux choses qui me chagrinent dans le code...

    D'une part le fait qu'un thread n'est pas réutilisable.... facilement.
    Je veux dire par la, qu'on ne peut pas démarrer un thread, l’arrêter, puis le redémarrer....

    Ensuite, la manière de l'arrêter (qui peut prendre 5 minutes dans le pire des cas).

    Si on en savait un poil plus sur les thread, je pourrais indiquer si il vaut mieux des AsyncTask, (ou autres), ou garder des threads... Mais ce que tu veux ce n'est pas arrêter le thread, juste le mettre en pause avec le bouton...
    Un truc genre:
    start()
    resume()
    pause()
    resume()
    pause()
    stop()
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    J'ai moi aussi pensé au problème de la coupure réseau. Je pense que je problème pourrai venir de là car effectivement si je reste chez moi, je n'ai pas constaté le problème.

    Après pour les threads ce que je fais c'est que je l'ai créer à chaque fois que l'on appuie sur le bouton démarrer et je les tue à l'appuie sur le bouton arrêter. Dans mes boucles de test, je rajoute à chaque fois la condition threadGPS ou threadHTTP != null histoire que la sortie ce fasse plus rapidement. Généralement cela met moins d'une minute.

    J'ai pensé également à remplacé mes threads par des services pour résoudre le problème. Il faut que je fasse des tests sur la route pour voir si cela résout le problème.

  6. #6
    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
    Si les threads "se coupent" tout seul, cela veut dire qu'un exception a eu lieu qui le fait sortir de la boucle...

    Déjà, évite les "e.printStackTrace()" qui ne servent à rien dans 100% des cas
    Remplace par Log.e("MonAPP","Erreur dans le thread xxxx",e);

    Ensuite, autour du run() un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void run() {
       while (this.running) {
           try {
               .... do something
           } catch (InterruptedException ie) {
               Log.d("MonAPP", "Thread XXX interrupted.");
           } catch (Exception ex) {
               Log.e("MonAPP", "Thread XXX received unexpected exception",ex);
               this.running = false;
           }
        }
    }
    Et pour arrêter le thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    thread.running = false;  thread.interrupt(); thread = null;
    Le "interrupt()" permettant de sortir immédiatement d'un état d'attente IO (ou sleep).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Ok merci beaucoup !

    Je vais essayer plusieurs chose.
    Déjà remplacer mes e.printStackTrace() et ajouter des interrupt.
    Et sinon remplacer les threads par des services.
    Le test sur la route est pour demain. Je mettrai les résultats sur le forum
    Merci pour vos réponses !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    J'ai remplacé mes threads par des services et cela passe beaucoup mieux.
    Cependant, il arrive que mon application et mes services ce coupent.
    Je me demande si ce n'est pas à cause d'un besoin de mémoire. Je voudrais savoir comment empêcher le téléphone de coupé mon processus.
    Cela peux ce produire également après un appel téléphonique, je sais que lors de l'appel les positions sont pas envoyé car le téléphone ne peut pas envoyé de la voix et du data en même temps, mais j'ai l'impression que le service ne redémarre pas après la fin de la communication.

  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
    Et une fois coupé, il y a quoi dans les logs du telephone ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    L'application et les services ne passent pas dans les log contenu dans les catch donc je ne pense pas que le problème vienne de la ! l'application est juste coupé comme si on avait appuyé sur le bouton arrêter !

    Et dans les logs du téléphone il y a plein de truc mais j'ai surtout vu ce log :
    07-24 13:16:57.789: D/ProgramMonitor(2101): onReceive - action:com.sec.android.app.controlpanel.CPU_USAGE_WARN

    07-24 13:16:57.789: I/ProgramMonitor(2101): cpu_usage_wan

    donc je pense que le téléphone coupe mon processus à cause de la mémoire

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/10/2009, 17h55
  2. Réponses: 15
    Dernier message: 31/01/2007, 22h03
  3. Réponses: 5
    Dernier message: 15/11/2006, 01h22
  4. Un thread de travail qui se termine et se libère tout seul
    Par bigquick dans le forum Threads & Processus
    Réponses: 15
    Dernier message: 24/06/2005, 13h58

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