使用Parcel克隆对象?

时间:2010-09-22 20:09:51

标签: android

我有一个实现了Parcelable的类。我可以执行以下操作来创建类的新实例吗?:

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

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

我希望foo2成为foo的克隆。

---------------------- update ------------------------ -------

以上不起作用(新实例中所有Foo成员都为null)。我在活动之间传递Foos就好了,所以Parcelable接口实现正常。使用下面的工作:

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.

从以下q:How to use Parcel in Android?

中找到了这个

这工作正常,我可以使用它,但它是额外的代码,不确定是否有更短的方法来做(除了正确实现复制构造函数...)。

由于

3 个答案:

答案 0 :(得分:13)

有一个较短的方法:

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();

答案 1 :(得分:7)

我遇到了同样的问题,这是我的解决方案:

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

答案 2 :(得分:0)

是的,假设您的parcel实现正确地写入和读取Foo中的所有变量,那应该创建一个克隆。