2010-09-22 10 views
5

Tengo una clase que ha implementado Parcelable. ¿Puedo hacer algo como lo foo2 siguiente para crear una nueva instancia de una clase ?:¿Usando Parcel para clonar un objeto?

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

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

Me gustaría ser un clon de foo.

---------------------- actualización ----------------------- --------

Lo anterior no funciona (todos los miembros de Foo son nulos en una nueva instancia). Estoy pasando Foos entre actividades muy bien, por lo que la interfaz Parcelable se implementa correctamente. Mediante el siguiente, que funciona:

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. 

encontraron esta de la siguiente q: How to use Parcel in Android?

Esto está funcionando bien, puedo ir con esto, pero es código extra, no estoy seguro si hay un camino más corto para hacer (además de implementar correctamente un constructor de copia ...).

Gracias

Respuesta

0

Sí, en el supuesto de que su aplicación parcela escribe y lee todas las variables en Foo, que debe crear un clon correctamente.

+0

Hmm sí que no, aunque - acabo de salir de un objeto, pero Foo todos sus miembros son nulos. Estoy pasando instancias de Foo entre actividades bien sin embargo. Utilicé un fragmento de otra Q que parece funcionar, actualizando la pregunta anterior. – user291701

+0

Ah, lo siento, realmente no compruebo la validez del código, solo en concepto es posible. Sin embargo, un constructor de copias definitivamente sería más eficiente si lo haces mucho. –

14

Hay un camino más corto:

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

que tenía el mismo problema y aquí está mi solución:

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