首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Parcel克隆对象?

使用Parcel克隆对象?
EN

Stack Overflow用户
提问于 2010-09-23 04:09:51
回答 3查看 5.3K关注 0票数 6

我有一个实现了Parcelable的类。我可以像下面这样创建一个类的新实例吗?

代码语言:javascript
复制
Foo foo = new Foo("a", "b", "c");

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

我想让foo2成为foo的克隆。

上述方法不起作用(新实例中所有Foo成员都为空)。我在活动之间传递Foos很好,所以Parcelable接口实现得很好。使用以下有效的方法:

代码语言:javascript
复制
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?

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

谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-08-24 07:24:05

有一种更短的方法:

代码语言:javascript
复制
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();
票数 15
EN

Stack Overflow用户

发布于 2014-11-13 05:19:06

我也有同样的问题,下面是我的解决方案:

代码语言:javascript
复制
Parcel p = Parcel.obtain();
foo.writeToParcel(p, 0);
p.setDataPosition(0); // <-- this is the key
Foo foo2 = Foo.CREATOR.createFromParcel(p);
p.recycle();
票数 9
EN

Stack Overflow用户

发布于 2010-09-23 04:28:04

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3773200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档