Harshul Pandav
Harshul Pandav

Reputation: 1036

Android Parcelable Issue

I had to pass a dataobject from one activity to another. The best way to do this is uing Parcelable. The dataobject had some fields with setter and getter methods. After setting some fields and passing the object to another activity, wha tI observed is that the field values got interchanged to other field values. The order of fields for writing to parcel and reading from parcel is the same.

public void writeToParcel(Parcel out, int flags) {
    out.writeInt(id);
    out.writeString(appNo);
    out.writeString(this.policyNo);
    out.writeInt((int)this.AppRcptDt.getTime());
    out.writeString(this.currentStatus);
    out.writeString(this.productCd);
    out.writeDouble(this.sumAssured);
    out.writeDouble(this.modalPremium);
    out.writeDouble(this.annualPremium);
    out.writeString(this.paymentMode);
    out.writeString(this.branchCd);
    out.writeString(this.branchName);
    out.writeString(this.insuredName);
    out.writeString(this.auraStatus);
    out.writeString(this.ownerName);
    out.writeString(this.agentCd);
    out.writeString(this.billingMode);
}

private ApplicationTrackerDO(Parcel in) {
    id=in.readInt();
    this.appNo = in.readString();
    this.policyNo = in.readString();
    this.AppRcptDt = new Date(in.readLong());
    this.currentStatus = in.readString();
    this.productCd = in.readString();
    this.sumAssured = in.readDouble();
    this.modalPremium = in.readDouble();
    this.annualPremium = in.readDouble();
    this.paymentMode = in.readString();
    this.branchCd = in.readString();
    this.branchName = in.readString();
    this.insuredName = in.readString();
    this.auraStatus = in.readString();
    this.ownerName = in.readString();
    this.agentCd = in.readString();
    this.billingMode = in.readString();
}

difference in field values

Upvotes: 4

Views: 3740

Answers (4)

Morilo
Morilo

Reputation: 1

java.util.Date implements Serializable:

public class Date implements Serializable, Cloneable, Comparable<Date> {

    private static final long serialVersionUID = 7523967970034938905L;

    // Used by parse()
    private static final int CREATION_YEAR = new Date().getYear();

    private transient long milliseconds;


Use:

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeSerializable(myDateField);
}
private MyClass(Parcel in) {
    myDateField = (Date)in.readSerializable();
}

Upvotes: 0

Mario
Mario

Reputation: 758

my solution to provide an date object with null

@Override
    public void writeToParcel ( Parcel dest, int flags ) {
        dest.writeInt((birthday != null) ? 1 : 0); // is birthday set?
        dest.writeLong((birthday != null) ? birthday.getTime() : 0);
    }

    public void readFromParcel ( Parcel in ) {
        if(in.readInt() == 1) {
            birthday = new Date(in.readLong());
        } else {
            in.readLong(); // ignore stored value
            birthday = null;
        }
    }

Upvotes: 0

waqaslam
waqaslam

Reputation: 68177

You are writing int

out.writeInt((int)this.AppRcptDt.getTime());

But reading long

this.AppRcptDt = new Date(in.readLong());

Upvotes: 1

MahdeTo
MahdeTo

Reputation: 11184

It is not the order but the data type that is not the same, from the first 4 lines you write int, string, string, int then you read int, string, string, long. I didn't check any further, you must match both order and datatype of read and write operations.

Upvotes: 11

Related Questions