2010-09-22 14 views
5

Mam klasę, która zaimplementowała Parcelable. Mogę zrobić coś jak foo2 następujące czynności, aby utworzyć nową instancję klasy ?:Używanie Parcela do klonowania obiektu?

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

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

Chciałbym być klonem foo.

---------------------- Aktualizacja ----------------------- --------

Powyższe nie działa (wszyscy członkowie Foo mają wartość zerową w nowym wystąpieniu). Przekazuję Foos pomiędzy działaniami w porządku, więc interfejs Parcelable jest zaimplementowany w porządku. Korzystanie z poniżej której działa:

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. 

oceniły tę z poniższej Q: How to use Parcel in Android?

To działa ok, mogę iść z tym, ale jest to dodatkowy kod, nie wiem, czy istnieje krótsza droga do zrobienia to (inne niż prawidłowe wdrożenie konstruktora kopii ...).

Dzięki

Odpowiedz

0

Tak, przy założeniu, że realizacja paczka poprawnie pisze i czyta wszystkie zmienne w Foo, że należy stworzyć klona.

+0

Hmm tak to nie, choć - po prostu wyjść, ale obiekt Foo wszyscy jego członkowie mają zerową wartość. Przekazuję instancje Foo między różnymi działaniami. Użyłem fragmentu z innego Q, który wydaje się działać, aktualizując powyższe pytanie. – user291701

+0

Ach, przepraszam, że tak naprawdę nie sprawdziłem poprawności kodu, tylko w koncepcji jego ewentualności. Jednak konstruktor kopii byłby zdecydowanie bardziej skuteczny, jeśli robisz to dużo. –

14

Jest krótsza droga:

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

miałem ten sam problem i tutaj jest moje rozwiązanie:

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