2017-04-10 2 views
1

In einem Android-Projekt habe ich eine Klasse mit diesen Feldern:Parcel Objekt mit Aufzählungen in Android

public class TransactionHistoryDetail1 implements Parcelable, DatabaseEnabled{ 

    private long id; 
    private static final String TABLE_NAME = "TransactionHistoryDetail"; 
    private static final String EMPTY_STRING = ""; 

    @XmlElement(name = "TxUd", required = true) 
    private String TxUd; 
    @XmlElement(name = "TxLclDtTm", required = true) 
    private Date TxLclDtTm; 
    @XmlElement(name = "CcyCd") 
    private CurrencyCode CcyCd; 
    @XmlElement(name = "Amt") 
    private BigDecimal Amt; 
    @XmlElement(name = "PmttpCd", required = true) 
    private PaymentTypeCode PmttpCd; 
    @XmlElement(name = "OprtnCd", required = true) 
    private OperationCode OprtnCd; 
    @XmlElement(name = "AppLabltpCd", required = true) 
    private AppLabelTypeCode AppLabltpCd; 
    @XmlElement(name = "PdSrl") 
    private String PdSrl; 
    @XmlElement(name = "PdBrndDsc") 
    private String PdBrndDsc; 
    @XmlElement(name = "UsrEml") 
    private String UsrEml; 
    @XmlElement(name = "CstmrAdr") 
    private String CstmrAdr; 
    @XmlElement(name = "TxDtlDsc") 
    private String TxDtlDsc; 
    @XmlElement(name = "TxRltdInd") 
    private boolean TxRltdInd; 
    @XmlElement(name = "TxSttsCd", required = true) 
    private TransactionStatusCode TxSttsCd; 
    @XmlElement(name = "UpdtDt", required = true) 
    private Date UpdtDt; 
... 
} 

Im Versuch, Objekte dieser Klasse als Parcelables zu schreiben und zu lesen, aber im nicht sicher, wie das Schreiben und Lesen enums.

Meine writeToParcel Methode sieht wie folgt aus:

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    SimpleDateFormat sdf = new SimpleDateFormat(JsonBuilder.DateFormat); 

    dest.writeLong(id); 
    dest.writeDouble(Amt.doubleValue()); 
    dest.writeString(PdSrl); 
    dest.writeString(PdBrndDsc); 
    dest.writeString(TxUd); 
    dest.writeString(PdSrl); 
    dest.writeString(UsrEml); 
    dest.writeString(CstmrAdr); 
    dest.writeString(TxDtlDsc); 
    dest.writeString((CcyCd == null) ? "" : CcyCd.name()); 
    dest.writeString((PmttpCd == null) ? "" : PmttpCd.name()); 
    dest.writeString((OprtnCd == null) ? "" : OprtnCd.name()); 
    dest.writeString((AppLabltpCd == null) ? "" : AppLabltpCd.name()); 
    dest.writeString(sdf.format(TxLclDtTm)); 
    dest.writeString(sdf.format(UpdtDt)); 
    dest.writeByte((byte) (TxRltdInd ? 1 : 0)); 
} 

und mein Constructor mit Parcel sieht wie folgt aus

privaten TransactionHistoryDetail1 (Parcel in) {

SimpleDateFormat sdf = new SimpleDateFormat(JsonBuilder.DateFormat); 
    try { 
     TxLclDtTm = sdf.parse(in.readString()); 
     UpdtDt = sdf.parse(in.readString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    id = in.readLong(); 
    TxUd = in.readString(); 
    PdSrl = in.readString(); 
    PdBrndDsc = in.readString(); 
    UsrEml = in.readString(); 
    CstmrAdr = in.readString(); 
    TxDtlDsc = in.readString(); 
    TxRltdInd = in.readByte() != 0; 
    Amt = new BigDecimal(in.readDouble()); 
    CcyCd = CurrencyCode.valueOf(in.readString()); 
    PmttpCd = PaymentTypeCode.valueOf(in.readString()); 
    OprtnCd = OperationCode.valueOf(in.readString()); 
    AppLabltpCd = AppLabelTypeCode.valueOf(in.readString()); 
    TxSttsCd = TransactionStatusCode.fromValue(in.readString()); 

} 

Die writeToParcel i belive seine Arbeits naja, aber der Konstruktor stürzt bei der "CcyCd" Zeile ab.

Meine Currency Klasse ist eine Enum, (so PaymentTypeCode, OperationCode und AppLabelTypeCode), die wie folgt aussieht: mit Aufzählungen in Parcelables

@XmlType(name = "CurrencyCode") 
@XmlEnum 
public enum CurrencyCode { 

    EUR; 

    public String value() { 
     return name(); 
    } 

    public static CurrencyCode fromValue(String v) { 
     return valueOf(v); 
    } 
} 

Gibt es eine andere Art und Weise umgehen?

Die Ausnahme i bekommen, ist dies:

java.lang.RuntimeException: Kann Aktivität ComponentInfo {package/package.activities.ChildActivity} starten: java.lang.IllegalArgumentException: Nein Enum Konstante package.data .apiClasses.CurrencyCode. EUR CASH CLS APP 2017-04-10T09: 07: 52.525Z 2017-04-10T09 : 07: 52.528Z CHILD_12345 ?

Antwort

1

allererst Sie vom Parcel in der genaue Reihenfolge lesen sollte, die Sie es geschrieben haben. Da Paket nur Daten schreiben und lesen, anstatt Daten serialisieren zu können, muss man lesen und schreiben, sonst liest man falsche Werte und erhält Fehler.

Es ist das Beste, wenn Sie Enum als int behandeln, schreiben sie parcel wie folgt aus:

dest.writeInt(this.CcyCd == null ? -1 : this.CurrencyCode.ordinal()); 

und lesen sie sie wie folgt aus:

int tmpCurrencyCode = in.readInt(); 
this.CcyCd = tmpCurrencyCode == -1 ? null : CurrencyCode.values()[tmpMState]; 

PS: Dieser Code-Check für nULL-Werte zu ^^

+1

Was ist tmpMState? – Ric

+0

Ich rate seinen tmpCurrencyCode. Ich bekomme einige seltsame Werte im tmpCurrencyCode nach in.readInt() bereits 0, 101, 24 und so weiter. Danach bekomme ich eine Exception in der folgenden Zeile. Kann die Aktivität nicht starten ComponentInfo {package/package.activities.ChildActivity}: java.lang.ArrayIndexOutOfBoundsException: length = 1; index = 24 – Ric

+0

Befolgen Sie die Reihenfolge beim Lesen und Schreiben Paket? Sie sollten aus dem Paket genau in der Reihenfolge lesen, die Sie ihm geschrieben haben, aber in Ihrem Code tun Sie es nicht in Reihenfolge. –