2010-09-22 48 views
5

Tôi có một lớp học đã thực hiện Parcelable. Tôi có thể làm điều gì đó như sau để tạo một trường hợp mới của một lớp học không ?:Sử dụng Bưu kiện để sao chép một đối tượng?

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

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

Tôi muốn foo2 là một bản sao của foo.

---------------------- cập nhật ----------------------- --------

Ở trên không có tác dụng (tất cả các thành viên Foo đều trống trong trường hợp mới). Tôi đang đi qua Foos giữa các hoạt động tốt, vì vậy giao diện Parcelable được thực hiện ok. Sử dụng dưới đây mà hoạt động:

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. 

thấy điều này từ q sau: How to use Parcel in Android?

Đây là hoạt động ok, tôi có thể đi với điều này nhưng nó là thêm mã, không chắc chắn nếu có một cách ngắn hơn để làm nó (khác hơn là thực hiện đúng một hàm tạo bản sao ...).

Cảm ơn

Trả lời

0

Có, giả sử rằng việc triển khai gói của bạn viết chính xác và đọc tất cả các biến trong Foo, sẽ tạo bản sao.

+0

Hmm yeah nó không mặc dù - Tôi chỉ nhận ra một đối tượng Foo nhưng tất cả các thành viên của nó là null. Tôi đang đi qua Foo trường hợp giữa các hoạt động tốt mặc dù. Tôi đã sử dụng đoạn trích từ một câu hỏi khác có vẻ như hoạt động, cập nhật câu hỏi trên. – user291701

+0

Ah, xin lỗi tôi đã không thực sự kiểm tra tính hợp lệ của mã, chỉ trong khái niệm của nó possbile. Tuy nhiên, một nhà xây dựng bản sao chắc chắn sẽ hiệu quả hơn nếu bạn làm điều đó rất nhiều. –

14

Có một cách ngắn:

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

tôi đã cùng một vấn đề và đây là giải pháp của tôi:

Parcel p = Parcel.obtain(); 
foo.writeToParcel(p, 0); 
p.setDataPosition(0); // <-- this is the key 
Foo foo2 = Foo.CREATOR.createFromParcel(p); 
p.recycle(); 
Các vấn đề liên quan