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 :

static pas static, ça me rend fou, et je tourne en rond


Sujet :

Android

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut static pas static, ça me rend fou, et je tourne en rond
    Bonjour à toutes et à tous,

    Dans mon package principal, je déclare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextView monText = finViewById(R.id.MonTexte);
    puis je l'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTexte.setText("un texte");
    Pas de problème.

    Maintenant, j'ai un grande quantité de widgets relatifs à une fonctionnalité que je voudrais mettre à part dans un package pour plus de clarté. Donc, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class SAT extends Activity {
     
        public TextView monTexte = findViewById(R.id.MonTexte);
     
    }
    Pas de problèmes.

    Mais si je veux utiliser ce widget :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SAT.monTexte.setText("un texte");
    là, ça ne va plus car on me dit que "monTexte" devrait être "static". Soit, je le mets en static, mais à ce moment, c'est le "findViewById" du package SAT qui n'est plus d'accord car il ne veut pas que "monTexte" soit static.

    Je fais comment ?

    Merci de votre aide.

    Pierre.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Maintenant, j'ai un grande quantité de widgets relatifs à une fonctionnalité que je voudrais mettre à part dans un package pour plus de clarté
    Pourquoi dans ce cas les mettre dans une classe (SAT) qui dérive d'une Activity ? Et pas simplement dans une classe dédiée à ces widget a laquelle tu passerais le context courant par exemple ?

    Utiliser une variable statique n'est pas anodin, celà implique par exemple que la variable est partagé entre toutes les instances de la classe , ce qui peux vite conduire à des effets de bords si on ne maitrise pas ce que l'on fait.

    Il serait peut être plus simple de nous montrer ce que tu as aujourd'hui et ce que tu veux changer (et pourquoi)
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par grunk Voir le message
    ... Il serait peut être plus simple de nous montrer ce que tu as aujourd'hui et ce que tu veux changer (et pourquoi)
    Ce que je veux faire, je l'ai dit précédemment : "Maintenant, j'ai un grande quantité de widgets relatifs à une fonctionnalité que je voudrais mettre à part dans un package pour plus de clarté. ..." car mon package Main est déjà tellement grand qu'il est difficile d'y naviguer.

    Aujourd'hui, ces widgets sont dans le Main comme ci-dessous :

    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
     
    package com.example.gpsnav.Navig;
     
    import ...;
     
    public class Main extends Activity implements SensorEventListener, LocationListener, GpsStatus.Listener {
     
        public TextView capSAT;
        public TextView valCapSAT;
        public TextView fixSAT;
        public TextView valFixSAT;
     
     
    		@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    			setContentView(R.layout.activity_main);
     
    	capSAT = findViewById(R.id.CapSAT);
    	valCapSAT = findViewById(R.id.ValCapSAT);
    	fixSAT = findViewById(R.id.FixSAT);
    	valFixSAT = findViewById(R.id.ValFixSAT);
     
    ...
     
    // Utilisation de ces widgets
     
    	valCapSAT.setText(String.format(Locale.US, "%.1f °", -capCor));
    	valFixSAT.setText(String.format(Locale.US, "%d / %d", nbFix, nbSat));
    Je voudrais tout simplement mettre leurs déclarations dans un autre package tel que :

    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
     
    package com.example.gpsnav.Navig;
     
    import ...;
     
    public class SAT {
     
        public TextView capSAT;
        public TextView valCapSAT;
        public TextView fixSAT;
        public TextView valFixSAT;
     
     
    	capSAT = findViewById(R.id.CapSAT);
    	valCapSAT = findViewById(R.id.ValCapSAT);
    	fixSAT = findViewById(R.id.FixSAT);
    	valFixSAT = findViewById(R.id.ValFixSAT);
     
    ...
    et continuer à les utilise dans le package Main (et autres) tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    package com.example.gpsnav.Navig;
     
    import ...;
     
    public class Main extends Activity implements SensorEventListener, LocationListener, GpsStatus.Listener {
     
     
    ...
     
    // Utilisation de ces widgets
     
    	SAT.valCapSAT.setText(String.format(Locale.US, "%.1f °", -capCor));
    	SAT.ValFixSAT.setText(String.format(Locale.US, "%d / %d", nbFix, nbSat));
    Mais apparemment cela pose problème dû au fait Qu'à l’utilisation ce devrait être static mais pas pour le "findViewById"

    NOTA : dans les messages d'erreur il est aussi fait mention de "memory leak". Je n'ai jamais bien compris ce que cela voulait dire et ce que cela impliquait, causait comme désagrément.

    Cordialement.

    Pierre.

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Ok , donc une simple classe SAT , comme tu la présente ici devrait faire le job. il faut en revanche lui donner une référence vers activity pour pouvoir utiliser [code]findviewbyid()[/codeinline]
    Quelque chose comme :

    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
    public class SAT {
     
        public TextView capSAT;
        public TextView valCapSAT;
        public TextView fixSAT;
        public TextView valFixSAT;
     
    	private Activity activity;
     
    	SAT(Activity act) {
    		this.activity = act;
    		capSAT = this.activity.findViewById(R.id.CapSAT);
    		valCapSAT = this.activity.findViewById(R.id.ValCapSAT);
    		fixSAT =this.activity. findViewById(R.id.FixSAT);
    		valFixSAT = this.activity.findViewById(R.id.ValFixSAT);
    	}
    }
    Et donc dans ton activity tu fais appel à cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sat sat = new SAT(this);
    sat.capSAT.setText("mon text");
    NOTA : dans les messages d'erreur il est aussi fait mention de "memory leak". Je n'ai jamais bien compris ce que cela voulait dire et ce que cela impliquait, causait comme désagrément.
    C'est quand une référence vers une variable n'est jamais désalloué , et donc la mémoire occupé par cette variable n'est jamais libéré par le programme.
    Java marche un garbage collector , ce qui veux dire que tu n'as pas , comme en C++ par exemple, à désalloué manuellement des variables. Pour simplifier , il compte les références sur une variables et dès que le compteur atteint 0 il supprime. Mais si le compteur n'atteint jamais zéro , il ne supprime jamais d'où mémory leak.
    Un peu de lecture sur le sujet : https://proandroiddev.com/everything...d-d7a59faaf46a

    Ceci étant dit , si ta mainActivity est surchargée de widget c'est qu'il y'a certainement un problème plus profond de conception.
    Soit il est temps d'utiliser des fragments pour "regrouper" un peu ce qui peut l'être
    Ou alors tu peux éventuellement créer des widget custom qui en regroupe plusieurs qui sont indissociables.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci grunk pour cette aide.

    Ce que tu me proposes fonctionne bien.

    Pour ce qui est du "memory leak" on me l'avait expliqué lorsque je m'étais mis à Android, mais j'ai, moi aussi, de fortes pertes de mémoires.

    Dans l'utilisation de mes widgets, je peux les appeler soit comme tu le dis : sat.capSAT.setText("mon text");, soit avec le nom du package : SAT.capSAT.setText("mon text");De ce que je comprends, pour appeler "findViewById", il lui faut la référence de l'activité principale (active ?). Dès lors, j'ai modifié ce que tu m'as proposé en :

    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
    public class SAT {
     
        public TextView capSAT;
        public TextView valCapSAT;
        public TextView fixSAT;
        public TextView valFixSAT;
     
     
    	public static void activ(Activity act) {
     
    		capSAT = act.findViewById(R.id.CapSAT);
    		valCapSAT = act.findViewById(R.id.ValCapSAT);
    		fixSAT = act. findViewById(R.id.FixSAT);
    		valFixSAT = act.findViewById(R.id.ValFixSAT);
    	}
    }
    L'appel se faisant dans mon activité principale par :

    Par ailleurs, si j'ai un si grand nombre de widgets, c'est parce que, dans une même activité, je mêle ce qui devrait être fait dans deux activités. Ce sont deux fonctions liées au GPS.

    La première affiche une carte et on s'y balade avec les données courants du GPS (traces, waypoints, ...) et la deuxième affiche les données typiques à la constellation des satellites (quand je passe d'une fonction à l'autre, je rends visibles/invisibles les widgets qui m'intéressent). Mais lorsque j'affiche ces données, je ne veux pas perdre mes traces et mes waypoints de la première fonction. Ce qui risque de se passer si' j'utilise deux activités.


    C'est ce que j'avais fait dans une précédente application et qui posait problème.

    Mais bon, tout ceci est à améliorer.

    Cordialement.

    Pierre.

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Bon, ce que j'ai fait est une ânerie car cela m'oblige à déclarer mes widgets en static.

    Mais, revenant à ce que tu me prescris, je tombe sur un autre problème.

    dans le package Main, je déclare :

    puis dans le onCreate de ce package j'instancie sat :

    plus loin dans ce package, j'utilise ses widgets et des méthodes les contenant.

    Jusque là pas de problème.

    Mais je veux utiliser ces widgets dans un autre package :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                sat.capSAT.setText("Cap Mag.");
    j'ai le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error: package sat does not exist
                sat.capSAT.setText("Cap Mag.");
    bien que dans les imports j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import com.example.gpsnav.Navig.SAT;
    dont il m'est dit par ailleurs que ce package n'est pas utilisé ???

    Je continue à tourner en rond !

    Merci de votre aide.

    Pierre.

  7. #7
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Bon, je m'aperçois que "sat" est défini dans mon package "Main", il faut donc que je l'appelle via ce Main, cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                Main.sat.capSAT.setText("Cap Mag.");
    Mais du coup, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     error: non-static variable sat cannot be referenced from a static context
                Main.sat.capSAT.setText("Cap Mag.");
    Je tourne en rond ...

    Cordialement.

    Pierre.

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Pas de petite idée de ce qu'il faut faire ?

    Je pense qu'il faut que je passe dans mes divers packages le "Context" en paramètre comme "grunk" m'a dit de le faire pour "Activity". J'ai essayé du bout des doigts, mais cela semble bien compliqué et j'ai l'impression qu'il faudrait que je reprenne toute la structure de mon application ...

    Pour l'instant, j'ai remis en statique tous mes widgets qui posent problème.

    L'on m'avertit donc du problème de perte de mémoire. Pour autant, je pense que ce n'est pas un problème dans la mesure où ces widgets sont créés au lancement de l'application et que je ne les supprime pas, ne le recrée pas et que je ne les déférence pas. Je ne fais que les masquer / démasquer selon que j'en aie besoin ou pas. Leur compteur d’instanciation ne revient donc jamais à zéro.

    Je dis des bêtises ou non ?

    Cordialement.

    Pierre.

Discussions similaires

  1. Visual Studio et Internet Explorer me rende fou :)
    Par neptune dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/11/2007, 16h05
  2. Un timer me rend fou. Est ce logique ?
    Par DOC doc doc dans le forum Simulink
    Réponses: 7
    Dernier message: 29/08/2007, 12h29
  3. [Débutant] une boucle for me rend fou.
    Par SirDarken dans le forum Langage
    Réponses: 6
    Dernier message: 13/09/2006, 00h25
  4. fonction log me rend fou
    Par adel25 dans le forum C++
    Réponses: 2
    Dernier message: 16/10/2005, 11h16

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