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 :

Activité qui plante


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Informaticien - Profesionnal master application development
    Inscrit en
    Octobre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien - Profesionnal master application development
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 47
    Par défaut Activité qui plante
    Bonsoir,

    J'ai un soucie avec une de mes activités qui plante lorsque je l'éxécute.

    Après avoir testé la mise en commentaires de certaines variables, apparement le problème viendrait plus spécifiquement de ma seule Int.

    voici le 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
    42
    43
    import android.app.Activity;
     
    public class PompeActivity extends Activity implements OnClickListener {
    	TextView SeriePompe;
    	TextView KcalPompe;
     
    	EditText NbrPompe;
     
    	Button ValiderPompe;
     
    	int NombrePompe;
     
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
     
    		setContentView(R.layout.pompe);
     
    			SeriePompe = (TextView) findViewById(R.id.seriepompe);
    			 SeriePompe.setOnClickListener(this);
     
    			NbrPompe = (EditText) findViewById(R.id.nbrpompe);
    			NbrPompe.setOnClickListener(this);
     
    			KcalPompe = (TextView) findViewById(R.id.kcalPompe);
     
    			NombrePompe = Integer.parseInt(NbrPompe.getText().toString());
    	}
     
    	public void onClick(View v) {
     
    		switch (v.getId()) {
     
    		case R.id.validerPompe:
    			NombrePompe = NombrePompe*2;
    			KcalPompe.setText(NombrePompe);
     
    		}
     
    	};
     
    }
    C'est certainement une faute bête mais je viens de reprendre la programmation android et j'ai peut-etre zappé quelques notions.

    Merci !

  2. #2
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    Salut,
    ça fait un moment que j'en ai pas fait aussi mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setContentView(R.layout.pompe);
    ne doit pas se mettre à la fin?

  3. #3
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Salut !

    Plusieurs remarques:
    • Tu devrais utiliser les balises [code], ca rendra le code plus lisible.
    • D'autre part, Java recommende de n'utiliser le "Full Camel Case" (premiere lettre majuscule des noms) que pour les types (classes, enum, interfaces). Les fonctions & variables doivent commencer par une minuscule.
    • Pour finir, ne pas conserver de "View" en membres de la classe, pour une raison toute bete, c'est que chaque view conserve le contexte (et donc l'activité), si l'activité garde une trace de la view tu risques de tomber dans des comportement mémoires bizarres (même si le garbage collector de java est assez intelligent, c'est "moche" en terme de programmation ). Rien ne t'empeche de faire des choses genre:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      ( (TextView) findViewById(R.id.seriepompe)).setOnClickListener(this);

    Sinon, que se passe-t-il quand que le contenu de R.id.nbrpompe est vide ? Le TextEdit est bien marqué en décimal ? Quelle est l'erreur affichée dans le LogCat ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Pour finir, ne pas conserver de "View" en membres de la classe, pour une raison toute bete, c'est que chaque view conserve le contexte (et donc l'activité), si l'activité garde une trace de la view tu risques de tomber dans des comportement mémoires bizarres (même si le garbage collector de java est assez intelligent, c'est "moche" en terme de programmation ). Rien ne t'empeche de faire des choses genre:

    En quoi es ce moche? et quel type de comportement mémoire parle tu?

  5. #5
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par yan Voir le message

    En quoi es ce moche? et quel type de comportement mémoire parle tu?
    C'est moche dans le sens ou l'on rajoute un tas de réferences pas forcément nécessaires (en l'occurence, dans le code montré, seule la méthode onCreate les utilise).

    C'est sur que ca pourrait être pire (avec une variable statique par exemple)....
    http://developer.android.com/resourc...ory-leaks.html

    Mais même sans parler de memory leak, conserver l'objet View dans l'activity veut dire qu'il ne pourra pas être marqué comme déréférencé (et donc susceptible d'etre collected par le GC) tant que l'activity n'est pas déréférencée elle-même, ce qui n'arrive qu'apres le onStop()...

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par nicroman Voir le message
    C'est moche dans le sens ou l'on rajoute un tas de réferences pas forcément nécessaires (en l'occurence, dans le code montré, seule la méthode onCreate les utilise).
    C'est sur que ca pourrait être pire (avec une variable statique par exemple)....
    http://developer.android.com/resourc...ory-leaks.html
    Merci pour le lien.

    Citation Envoyé par nicroman Voir le message
    Mais même sans parler de memory leak, conserver l'objet View dans l'activity veut dire qu'il ne pourra pas être marqué comme déréférencé (et donc susceptible d'etre collected par le GC) tant que l'activity n'est pas déréférencée elle-même, ce qui n'arrive qu'apres le onStop()...
    Vue qu'avant il n'y as pas de raison qu'elles soient collectées (sauf volonté du développeur et la il peux mettre en null les référence), je ne voit pas le problème.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par michel.di Voir le message
    ne doit pas se mettre à la fin?
    Non. Car c'est cette ligne qui instancie toutes les view.

  8. #8
    Membre averti
    Homme Profil pro
    Informaticien - Profesionnal master application development
    Inscrit en
    Octobre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien - Profesionnal master application development
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 47
    Par défaut
    J'ai changé le nom de mes variables puis j'ai essayé d'appliquer ta méthode avec l'écouteur d'événement directement à la suite de l'initialisation via l'id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seriePompe = ((TextView) findViewById(R.id.seriepompe)).setOnClickListener(this);
    Mais le message " Cannot convert from Void to Textview " s'affiche.

    J'avoue que je n'ai pas bien compris non plus le problème de comportement mémoire et je ne crois pas que le problème vienne de là.

    Je précise que l'activité plante avant même de s'affiche, directement au lancement depuis une autre activité, cependant comme indiqué au 1er post, si je place les lignes suivante en commentaire l'activité se lance correctement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //int nombrePompe;
    //nombrePompe = Integer.parseInt(nbrPompe.getText().toString());
    /*
    		case R.id.validerPompe:
    			nombrePompe = nombrePompe*2;
    			kcalPompe.setText(nombrePompe);
    */

  9. #9
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Peux tu nous montrer ton logcat pour voir quel message d'erreur apparaît ?

    Car vu de nez, si tu n'as aucune valeur dans nbrPompe.GetText() lors de ton 'parse', tu aura une erreur.

    Pour corriger le tir tu peux l'entourer d'un try catch en initialisant ta valeur dans le catch. l'exception a attrapé est NumberFormatException.

    Merci

  10. #10
    Membre averti
    Homme Profil pro
    Informaticien - Profesionnal master application development
    Inscrit en
    Octobre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien - Profesionnal master application development
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 47
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Car vu de nez, si tu n'as aucune valeur dans nbrPompe.GetText() lors de ton 'parse', tu aura une erreur.
    Le problème venait bien de là, aucune valeur n'étais encore attribuée.

    Maintenant l'activité se lance correctement, je peux entrer une valeur dans mon EditText mais elle plante lorsque je presse le bouton Valider qui exécute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		switch (v.getId()) {
     
    		case R.id.validerPompe:
     
    			nombrePompe = Integer.parseInt(nbrPompe.getText().toString());
     
    			nombrePompe = nombrePompe*10;
     
    			//kcalPompe.setText(nombrePompe);
     
    		}
    Le problème vient plus spécifiquement de la partieen commentaire (kcalPompe.setText(nombrePompe)) car autrement l'activité ne plante pas mais évidement rien ne se passe.

    Je souhaiterai simplement qu'une fois que l'utilisateur à pressé le bouton Valider, la valeur en int soit reprise de l'EditText, qu'un calcul soit fait puis qu'il soit afficher dans un TextView.

    Je suis navré de faire durer se cet article en longueur mais une fois cette activité réglé je pourai passer aux nombreuses autres qu'il me reste à faire.

    Merci de votre intêret.

  11. #11
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kcalPompe.setText(nombrePompe);
    Euh nombrePompe est un entier non ?

    dans ce cas ton code devrait ressembler à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kcalPompe.setText(Integer.toString(nombrePompe));

  12. #12
    Membre averti
    Homme Profil pro
    Informaticien - Profesionnal master application development
    Inscrit en
    Octobre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien - Profesionnal master application development
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 47
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kcalPompe.setText(nombrePompe);
    dans ce cas ton code devrait ressembler à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kcalPompe.setText(Integer.toString(nombrePompe));
    Merci beaucoup le problème venait bien de là, je vais enfin pouvoir passer à la suite.

    Bonne soirée et bon week-end à tous.

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

Discussions similaires

  1. PB d'update qui plante aléatoirement sans renvoyer d'erreur
    Par plc402 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2005, 09h10
  2. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22
  3. Programme qui plante
    Par harris_macken dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2005, 23h50
  4. Pc qui plante
    Par tooms2028 dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 19/03/2005, 17h32
  5. [JTextArea] redessin qui plante
    Par phil_ma dans le forum Composants
    Réponses: 3
    Dernier message: 04/01/2005, 05h19

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