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 :

Pourquoi les objets déclarés dans onCreate() restent même après ?


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut Pourquoi les objets déclarés dans onCreate() restent même après ?
    Bonjour,
    Je débute en Android et en apprenant à créer et initaliser des objects dans des activités, je n'est pas compris pourquoi le code injecté dans onClick() de l'objet button1 qui est déclaré dans le code de la méthode onCreate() reste utilisable même après la fin de la méthode onCreate() (et après même onStart() et onResume() )
    exemple de 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
     
    protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
     
    		final Button button1 = (Button) findViewById(R.id.button1) ;
    		final EditText editText1 = (EditText) findViewById(R.id.editText1) ;
     
     
    		button1.setOnClickListener(new OnClickListener() {
     
    			@Override
    			public void onClick(View v) {
    				String recherche = editText1.getText().toString() ;
    				Intent webSearchIntent = new Intent(Intent.ACTION_WEB_SEARCH) ;
    				webSearchIntent.putExtra(SearchManager.QUERY, recherche);
    				startActivity(webSearchIntent);
     
    			}
    		});
     
     
    	}

  2. #2
    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
    Car tu surcharges la fonction qui appartient à ton bouton ( en réel à son listener qui est une variable a lui) qui est lui sauvegardé en mémoire .

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Désolé je n'ai pas compris
    Si le boutton est détruit, tout sera détruit avec, mêmes les méthodes...
    Tu veux dire que l'interface surchargé onClickListener() qu'on passe en paramètre est stockée quelque part dans les instances de mon Activity ?

  4. #4
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Car tu surcharges la fonction qui appartient à ton bouton ( en réel à son listener qui est une variable a lui) qui est lui sauvegardé en mémoire .
    [Mode puriste=on]Il s'agit d'une redéfinition de méthode (override), pas d'une surcharge (overload)[Mode puriste=off]

    Pour en revenir à la question, il s'agit d'une classe anonyme et cela n'aide pas les débutants en Java à comprendre ! La preuve encore une fois de plus...

    Réécris donc ton code en créant une vraie classe séparée : c'est un bon exercice et cela aura le mérite de remettre les choses à leur place (les classes anonymes sont une déviance ).
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Je crée une classe ClassA Implements onClickListener et j'y redéfinie, par polymorphisme, la méthode onClick().
    ma classA n'est jamais détruite et elle fait partie du package (?)
    onClickListener a plusieurs fillettes qui, chacune a un id noté quelques parts dans les paramètres du bouton (un fichier XML je présume ou un R.java) (?)
    Les classes anonymes, bien qu'elles le soient, ont quand même leurs places dans le package et son hiérarchie (?)
    est-ce ça ?

  6. #6
    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
    [Mode puriste=on]Il s'agit d'une redéfinition de méthode (override), pas d'une surcharge (overload)[Mode puriste=off]
    mouais c'est vrai mais pour expliquer souvent là tu embrouilles les gens, car quand tu surcharges une fonction souvent tu vas mettre le mot clé Override en JAVA donc bon courage pour expliquer .

    ma classA n'est jamais détruite et elle fait partie du package (?)
    Tu parles du .class oui c'est dans le paquetage sinon la mémoire alloué pour cette classe sera désalloué quand les objets l'instanciant seront désalloués.

    onClickListener a plusieurs fillettes qui, chacune a un id noté quelques parts dans les paramètres du bouton (un fichier XML je présume ou un R.java) (?)
    Euh là on confonds tout. Les id sont généré par le fichier R.java au moment de la compilation pour faire le lien avec tes objets Resources. ( bouton, strings, etc...)

    Là ta class onClickListener que tu déclares avec un new en rédéfinissant la méthode onClick est alloué. (Classe Anonyme car tu l'instancie directement à sa déclaration)

    Les classes anonymes, bien qu'elles le soient, ont quand même leurs places dans le package et son hiérarchie (?)
    est-ce ça ?
    Oui car tu instancies cette classe anonyme à partir d'une classe qui elle est dans le "paquetage".
    ( Lors de la compilation, le compilateur génère un fichier constitué du nom de la classe englobante puis un ‘$’, puis un nombre puis “.class”.)
    http://imss-www.upmf-grenoble.fr/pre.../classes3.html

    Ca je ne savais pas...

    NB: en me relisant je me demande si je suis clair.

  7. #7
    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
    J'avoue Feanorin que même moi j'ai du mal...

    Déjà, on a pas parlé " d'instance ".

    Une classe, est une classe... on ne pointe pas sur une classe, on ne stocke pas une classe (sauf avec une référence de type Class<?> )

    Par contre, on peut référencer une *instance* de la classe Toto avec une reference de type .... Toto bien vu.


    Dans le cadre d'un bouton, l'objet en mémoire qui représente ce bouton (et qui est lui même l'instance d'une classe "Button"), contient une référence sur un objet de type "OnClickListener"
    Selon la règle de l'héritage: quand on "dérive" de OnClickListener, on a la relation *est-un*.
    Donc toute instance de la classe "Titi" qui hérite de OnClickListener *est-un* OnClickListener, et peut donc être référencé (et par la suite utilisé) par le-dit bouton.



    Les classes anonymes suivent exactement la même règle, elles sont anonymes car le programmeur ne leur a pas donné de nom, mais le compilateur, lui, il lui en a donné un de nom: $1, $2, ....
    Et le "new" permet de créer une instance de cette classe.

    Mais il n'y a absoluement *aucune* différente entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Toto
    {
         public void maFonction()
         {
              setOnClickListener(new View.OnClickListener { 
                   public void onClick(View v) { .... } }());
         }
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Toto
    {
         class Listener_1 implements View.OnClickListener {
              public void onClick(View v) { .... } 
         }
     
         public void maFonction()
         {
              setOnClickListener(new Listener_1());
         }
    }
    A part la lisibilité accrue du second code, il n'y a vraiment aucune différence.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/05/2008, 07h24
  2. pourquoi les tests sont dans le forum qualite ?
    Par _vince_ dans le forum Test
    Réponses: 6
    Dernier message: 26/03/2008, 09h15
  3. TIBTransaction.Rollback ne supprime pas les objets créés dans le script
    Par sangkookay dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 02/10/2007, 14h26
  4. Utiliser directement les objets NHibernate dans le viewer
    Par HMplusplus dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 22/08/2007, 17h45
  5. Utilisation des objets déclarés dans un repeater
    Par grosdave653 dans le forum Flex
    Réponses: 1
    Dernier message: 13/08/2007, 10h13

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