2010-09-22 5 views
5

J'ai une classe qui a implémenté Parcelable. Puis-je faire quelque chose comme ce qui suit pour créer une nouvelle instance d'une classe ?:Utiliser Colis pour cloner un objet?

Foo foo = new Foo("a", "b", "c"); 

Parcel parcel = Parcel.obtain(); 
foo.writeToParcel(parcel, 0); 
Foo foo2 = Foo.CREATOR.createFromParcel(parcel); 

Je voudrais foo2 d'être un clone de foo.

---------------------- mise à jour ----------------------- --------

Ce qui précède ne fonctionne pas (tous les membres Foo sont null dans la nouvelle instance). Je passe Foos entre les activités très bien, donc l'interface Parcelable est implémentée ok. Utilisation de la ci-dessous, ce qui fonctionne:

Foo foo1 = new Foo("a", "b", "c"); 
Parcel p1 = Parcel.obtain(); 
Parcel p2 = Parcel.obtain(); 
byte[] bytes = null; 

p1.writeValue(foo1); 
bytes = p1.marshall(); 

p2.unmarshall(bytes, 0, bytes.length); 
p2.setDataPosition(0); 
Foo foo2 = (Foo)p2.readValue(Foo.class.getClassLoader()); 

p1.recycle(); 
p2.recycle(); 

// foo2 is the same as foo1. 

trouvé cela de la q suivante: How to use Parcel in Android?

Cela fonctionne bien, je peux aller avec cela, mais il est un code supplémentaire, pas sûr s'il y a un moyen de faire plus court il (autre que l'implémentation correcte d'un constructeur de copie ...).

Merci

Répondre

0

Oui, en supposant que votre implémentation de colis écrit correctement et lit toutes les variables Foo, qui devrait créer un clone.

+0

Hmm oui, il n'a pas bien - je viens de sortir un objet Foo mais tous ses membres sont nuls. Je passe des instances de Foo entre les activités très bien cependant. J'ai utilisé un extrait d'un autre Q qui semble fonctionner, mettant à jour la question ci-dessus. – user291701

+0

Ah, désolé je n'ai pas vraiment vérifié la validité du code, juste en concept sa possbile. Cependant, un constructeur de copie serait certainement plus efficace si vous le faites beaucoup. –

14

Il existe un moyen plus court:

Foo foo1 = new Foo("a", "b", "c"); 
Parcel p = Parcel.obtain(); 
p.writeValue(foo1); 
p.setDataPosition(0); 
Foo foo2 = (Foo)p.readValue(Foo.class.getClassLoader()); 
p.recycle(); 
7

J'ai eu le même problème et voici ma solution:

Parcel p = Parcel.obtain(); 
foo.writeToParcel(p, 0); 
p.setDataPosition(0); // <-- this is the key 
Foo foo2 = Foo.CREATOR.createFromParcel(p); 
p.recycle();