Android 创建地块对象的副本

Android 创建地块对象的副本,android,parcelable,Android,Parcelable,我使用地块对象将值从一个进程传递到另一个进程。我想创建地块对象的克隆,但无法使用clone()方法。如果有人知道如何创建地块副本,请提供解决方案 假设您的对象实现了Parcelable接口,您应该能够执行以下操作: SomethingParcelable myObject = new SomethingParcelable(); Parcel p = Parcel.obtain(); myObject.writeToParcel(p, 0); //must be called after u

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

假设您的对象实现了
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);

建议的解决方案不完整,无法工作

这里有一个可行的解决方案:

(我有一个MessageDescriptor类型的名为message的对象,我想克隆它)


对于复制构造函数也很有用

/**
 * 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();
}

另一种不访问特定于对象的创建者而创建副本的方法是使用以下通用方法

 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();
        }
    }
}
public T deepClone(T objectToClone){
地块=空;
试试{
parcel=parcel.get();
parcel.writeParcelable(objectToClone,0);
包裹。setDataPosition(0);
返回packet.readParcelable(objectToClone.getClass().getClassLoader());
}最后{
如果(包裹!=null){
包裹回收();
}
}
}
 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();
        }
    }
}