我正在使用parcel对象将值从一个进程传递到另一个进程。我想创建一个parcel对象的克隆,但我无法使用clone()方法如果有人知道如何创建parcel的副本,请提供解决方案。
答案 0 :(得分:16)
建议的解决方案不完整,无效。
这是一个有效的解决方案:
(我有一个名为MessageDescriptor类型的消息,我想克隆它)
Parcel parcel = Parcel.obtain();
message.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
MessageDescriptor messageToBeSent = MessageDescriptor.CREATOR.createFromParcel(parcel);
parcel.recycle();
答案 1 :(得分:5)
假设您的对象实现了Parcelable
接口,您应该能够执行以下操作:
SomethingParcelable myObject = new SomethingParcelable();
Parcel p = Parcel.obtain();
myObject.writeToParcel(p, 0);
//must be called after unmarshalling your data.
p.setDataPosition(0);
SomethingParcelable myClonedObject = SomethingParcelable.CREATOR.createFromParcel(p);
答案 2 :(得分:0)
对复制构造函数也很有用。
/**
* Copy request passed in.
*
* @param request Request To clone, null is accepted, just creates a blank object
*/
public RealTimeJourneyPlanRequest(@Nullable RealTimeJourneyPlanRequest request) {
if(request == null) return;
// Only copy if the request past in is not null
// Use the Parcel as its does deep cloning for us.
final Parcel parcel = Parcel.obtain();
request.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
// Copy into this object
readFromParcel(parcel);
// Clean parcel back into object pool
parcel.recycle();
}
答案 3 :(得分:0)
创建副本而不访问对象特定的CREATOR的另一种方法是使用以下通用方法。
public <T extends Parcelable> T deepClone(T objectToClone) {
Parcel parcel = null;
try {
parcel = Parcel.obtain();
parcel.writeParcelable(objectToClone, 0);
parcel.setDataPosition(0);
return parcel.readParcelable(objectToClone.getClass().getClassLoader());
} finally {
if (parcel != null) {
parcel.recycle();
}
}
}