Android Parcelable Проблема

Мне пришлось передать объект данных из одного действия в другое. Лучший способ сделать это — использовать Parcelable. В объекте данных было несколько полей с методами установки и получения. После настройки некоторых полей и передачи объекта другому действию я заметил, что значения полей были заменены значениями других полей. Порядок полей для записи в посылку и чтения из посылки одинаков.

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

разница в значениях полей


person Harshul Pandav    schedule 16.04.2012    source источник


Ответы (4)


Не порядок, а тип данных не тот, из первых 4-х строк пишешь int, string, string, int, потом читаешь int, string, string, long. Я больше не проверял, вы должны соответствовать как порядку, так и типу данных операций чтения и записи.

person MahdeTo    schedule 16.04.2012

Вы пишете int

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

Но читать долго

this.AppRcptDt = new Date(in.readLong());
person waqaslam    schedule 16.04.2012
comment
это не удастся, если this.AppRcptDt имеет значение null. - person Mario; 18.06.2013
comment
у меня была проблема, когда моя переменная даты должна быть нулевой, чтобы определить, что она не установлена ​​(например, день рождения) - person Mario; 25.06.2013
comment
Это должно быть просто. Если ваша дата null, просто напишите вместо нее 0. Например: out.writeLong((dt == null)? 0 : dt.getTime()); - person waqaslam; 25.06.2013
comment
но когда я прочитаю длинный для нового экземпляра даты, он создаст реальную дату, потому что [new Date(0)!= null], поэтому я не могу предположить, не был ли установлен день рождения или пользовательский объект имеет эту дату как день рождения - person Mario; 25.06.2013
comment
при чтении значения, если оно получено как 0, просто установите для него значение null - person waqaslam; 26.06.2013
comment
я думаю, вы не понимаете, что я имею в виду: если вы предоставляете графический интерфейс для добавления некоторых исторических личностей и хотите создать кого-то, кто родился 01.01.1970, поэтому миллисекунды будут равны 0, это означает, что когда вы снова читаете этого человека и устанавливаете день рождения обнулить, у вас есть ошибка в вашей системе на дату 01.01.1970. Хорошо, это произойдет только с лицами в возрасте › 43 лет, но это может быть возможно - person Mario; 03.07.2013
comment
тогда вместо того, чтобы иметь дело с getTime(), вы должны использовать SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); для сохранения объекта Date в string, а если он недоступен, просто вместо этого сохраните null. Время, когда вы читаете строку из Parcel, если она обнаружена как null, тогда также установите Date как нуль, в противном случае используйте тот же SimpleDateFormat для восстановления объекта даты из строки. - person waqaslam; 03.07.2013

мое решение предоставить объект даты с нулевым значением

@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;
        }
    }
person Mario    schedule 25.06.2013

java.util.Date реализует 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;


Использование:

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