2016-07-03 26 views
10

Qui è la mia classe del modello:Come leggere e scrivere Enum nel pacchetto su Android?

public enum Action { 
    RETRY, SETTINGS 
} 

private int imageId; 
private String description; 
private String actionName; 
private Action action; 

public NetworkError(int imageId, String description, String actionName, Action action) { 
    this.imageId = imageId; 
    this.description = description; 
    this.actionName = actionName; 
    this.action = action; 
} 

public int getImageId() { 
    return imageId; 
} 

public void setImageId(int imageId) { 
    this.imageId = imageId; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public String getActionName() { 
    return actionName; 
} 

public void setActionName(String actionName) { 
    this.actionName = actionName; 
} 


@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(this.imageId); 
    dest.writeString(this.description); 
    dest.writeString(this.actionName); 
} 

protected NetworkError(Parcel in) { 
    this.imageId = in.readInt(); 
    this.description = in.readString(); 
    this.actionName = in.readString(); 
} 

public static final Parcelable.Creator<NetworkError> CREATOR = new Parcelable.Creator<NetworkError>() { 
    @Override 
    public NetworkError createFromParcel(Parcel source) { 
     return new NetworkError(source); 
    } 

    @Override 
    public NetworkError[] newArray(int size) { 
     return new NetworkError[size]; 
    } 
}; 
+3

Le enumerazioni sono 'serializzabili'. – CommonsWare

+1

http://www.parcelabler.com/ – tachyonflux

+0

hai provato 'dest.writeValue()' – EpicPandaForce

risposta

25

Ho avuto problemi simili e la mia soluzione era:

parcel.writeString(this.questionType.name()); 

e per la lettura:

this.questionType = QuestionType.valueOf(parcel.readString()); 

QuestionType è enum e ricordo che l'ordinazione di gli elementi contano.

2

Enum decleration:

public enum Action { 

    NEXT(1), 
    OK(2); 

    private int action; 

    Action(int action) { 
     this.action = action; 
    } 

} 

Lettura da parcella:

protected ActionParcel(Parcel in) { 
    int actionTmp = in.readInt(); 
    action = Tutorials.Action.values()[actionTmp]; 
} 

Scrivendo a pacco:

public void writeToParcel(Parcel dest, int flags) { 
    int actionTmp = action == null ? -1 : action.ordinal(); 
    dest.writeInt(actionTmp); 
} 
4

Qualsiasi enum è serializzabile.

È possibile farlo in writeToParcel(): dest.writeSerializable(action)

E nel costruttore: action = (Action) in.readSerializable()

+1

Questa è la soluzione più semplice da implementare ma considerando che l'interfaccia 'serializzabile 'è molto più lenta di' parcelable', mi chiedo se questo ha qualche effetto sulle prestazioni rispetto alle risposte qui sotto in cui lanci l'enum ad un tipo più primitivo. – mcy

0

Il più efficiente - efficiente della memoria - fascio viene creato utilizzando il valore ordinale ENUM.

Scrivendo a Parcel dest.writeInt(enum_variable.ordinal());

Lettura dal pacco enum_variable = EnumName.values()[in.readInt()];

Questo dovrebbe andare bene a meno che non si presta attenzione ammonimenti della documentazione:

parcella non è un meccanismo di serializzazione general-purpose. Questa classe (e la corrispondente API Parcelable per il posizionamento di oggetti arbitrari in un pacchetto) è progettata come trasporto IPC ad alte prestazioni. Pertanto, non è appropriato inserire dati Pacchi nella memoria persistente: modifiche nell'implementazione sottostante di uno qualsiasi dei dati nel Pacchetto possono rendere illeggibili i dati meno recenti.

In altre parole, non si deve passare Pacchi tra le versioni di codice perché potrebbe non funzionare.

Problemi correlati