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 :

Passer un objet entre activités


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Par défaut Passer un objet entre activités
    Bonjour,

    En tant que débutant, j'ai besoin de votre avis sur le passage d'objets entre activités. J'ai une classe qui contient beaucoup de données membres dont plusieurs qui n'ont pas des types de base. Noter que cet objet correspond à un enregistrement dans une base de données SQLite.

    Parmi les options, j'ai vu des tutoriels sur Parcelable ou encore la sérialisation. J'ai aussi pensé à simplement passer le id de l'objet dans un intent et le reconstruire dans l'autre activité avec une requête à la bd du genre "getObjectById(long id)" ce qui nécessiterait beaucoup moins de code mais qu'en est-il au niveau de la performance?

    Dans ce cas, à votre avis quelle est la façon la plus optimale de passer un objet de cette classe d'une activité à l'autre?

    Merci beaucoup!

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    La méthode "standard" pour passer un objet est d'utiliser parcelable. Maintenant si ton objet contient d'autres objets , tu es également tenu d'implémenter Parcelable sur ces objets. Ca peux donc vite devenir beaucoup de travail.

    Parcelable sera à mon avis plus rapide qu'une requête et la reconstruction des objets (tu économises la requête). Sans compter que une fois Parcelable implémenter tu pourras trimballer tes objets partout sans souçis.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Par défaut
    Merci grunk!

    J'ai fait une première tentative et j'arrive à passer des objets ayant des données membres qui sont de types primitifs.

    Toutefois, comment passer une donnée membre de type Time, par exemple? J'ai utilisé sans succès la méthode writeValue(Object)... Si je comprends bien, ça ne fonctionne pas car Time n'implémente pas serializable? Comment faire en sorte de passer une donnée membre de type Time?

    Merci beaucoup pour votre aide!

  4. #4
    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
    Time ? ce n'est pas certainement pas un type primitif, ni même un type de base java.
    C'est un objet Android only, qui "wrappe" une date pour offrir du formatage.
    Utiliser toMillis() et set() pour respectivement écrire / lire un objet de ce type.

    J'ai fait une première tentative et j'arrive à passer des objets ayant des données membres qui sont de types primitifs.
    On pourrait voir le résultat de la tentative ? car implémenter Parcelable n'est pas très compliqué normalement....

  5. #5
    Membre habitué
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Par défaut
    Voilà! Tel que mentionné, c'est Time qui pose problème.

    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
    44
    45
    46
    47
    48
    49
     
    public class MonParcelable implements Parcelable {
     
    	private int m_Id;
    	private Time m_Date;
     
    	public MonParcelable(int p_id, Time p_date){
    		this.m_Id = p_id;
    		this.m_Date = p_date;
    	}
     
    	@Override
    	public int describeContents() {
    		return 0;
    	}
     
    	@Override
    	public void writeToParcel(Parcel p_dest, int p_flags) {
    		p_dest.writeInt(m_Id);
    		p_dest.writeValue(m_Date);	
    	}
     
    	public static final Parcelable.Creator<MonParcelable> CREATOR = new Parcelable.Creator<MonParcelable>() {
     
    		@Override
    		public MonParcelable createFromParcel(Parcel p_source) {
    			return new MonParcelable(p_source);
    		}
     
    		@Override
    		public MonParcelable[] newArray(int p_size) {
    			return new MonParcelable[p_size];
    		}		
    	};	
     
    	public MonParcelable(Parcel p_in){
    		this.m_Id = p_in.readInt();
    		this.m_Date = (Time) p_in.readValue(Time.class.getClassLoader());
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#toString()
    	 */
    	@Override
    	public String toString() {
    		return "MonParcelable [m_Id=" + this.m_Id + ", m_Date=" + this.m_Date
    				+ "]";
    	}
    }
    Merci pour l'aide!

  6. #6
    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
    Déjà question 1, pourquoi Time encore une fois ?
    Il ne semble pas y avoir de fonction de formatage dans l'objet, maintenir un objet "Time" est donc inutile... ne serait-ce pas plutôt java.util.Date ?

    Dans les deux cas, le code est le même:
    (au passage on évite de faire du "read" dans un constructeur):

    Code avec "Date":
    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
     
           private Date   m_Date;
     
           @Override
    	public void writeToParcel(Parcel p_dest, int p_flags) {
    		p_dest.writeInt(m_Id);
    		p_dest.writeLong(m_Date.getTime());	
    	}
     
            public void readFromParcel(Parcel p_src) {
                    m_Id = p_src.readInt();
                    m_Date = new Date(p_src.readLong());
            }
     
            private MonParcelable () { }
     
            public static final Parcelable.Creator<MonParcelable> CREATOR = new Parcelable.Creator<MonParcelable>() {
     
    		@Override
    		public MonParcelable createFromParcel(Parcel p_source) {
    			MonParcelable  ret = new MonParcelable();
                            ret.readFromParcel(p_source);
    		}
     
    		@Override
    		public MonParcelable[] newArray(int p_size) {
    			return new MonParcelable[p_size];
    		}		
    	};
    Code avec "Time" (même si à mon avis il y a gourrage de type):
    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
     
           private Time   m_Date;
     
           @Override
    	public void writeToParcel(Parcel p_dest, int p_flags) {
    		p_dest.writeInt(m_Id);
    		p_dest.writeLong(m_Date.toMillis(false));	
    	}
     
            public void readFromParcel(Parcel p_src) {
                    m_Id = p_src.readInt();
                    m_Date = new Time();
                    m_Date.set(p_src.readLong());
            }
     
            private MonParcelable () { }
     
            public static final Parcelable.Creator<MonParcelable> CREATOR = new Parcelable.Creator<MonParcelable>() {
     
    		@Override
    		public MonParcelable createFromParcel(Parcel p_source) {
    			MonParcelable  ret = new MonParcelable();
                            ret.readFromParcel(p_source);
    		}
     
    		@Override
    		public MonParcelable[] newArray(int p_size) {
    			return new MonParcelable[p_size];
    		}		
    	};

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

Discussions similaires

  1. Comment passer une valeur entre activités ?
    Par TheBeginer dans le forum Android
    Réponses: 2
    Dernier message: 03/12/2014, 11h22
  2. Passer une QMap entre deux objets
    Par Zhitoune dans le forum Débuter
    Réponses: 4
    Dernier message: 31/08/2011, 19h05
  3. [Web Services] Passer un objet comme entrée du client web service
    Par bel09 dans le forum Spring
    Réponses: 19
    Dernier message: 04/06/2009, 15h12
  4. [modelDriven] Passer un objet modèle entre 2 actions
    Par romainw dans le forum Struts 2
    Réponses: 2
    Dernier message: 16/10/2007, 13h33
  5. Réponses: 5
    Dernier message: 17/08/2005, 12h40

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