创建宗地对象的副本

时间:2011-09-19 07:40:29

标签: android parcelable

我正在使用parcel对象将值从一个进程传递到另一个进程。我想创建一个parcel对象的克隆,但我无法使用clone()方法如果有人知道如何创建parcel的副本,请提供解决方案。

4 个答案:

答案 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();
        }
    }
}