Запись перечисления в Посылку, вызывающее RuntimeException
Я только что опубликовал этот вопрос, и кто-то предложил мне взглянуть на другой ответ. В другом ответе он сказал мне, чтобы положить перечисление в посылку как Serializable
, (А если вы не понимаете, о чем я говорю, прочитайте пост выше.) Я попытался сделать это так:
protected QuestionOptions(Parcel in) {
digitCount = in.readInt ();
operationType = (OperationType)in.readSerializable ();
boolean[] array = new boolean[1];
in.readBooleanArray (array);
timerEnabled = array[0];
}
public static final Creator<QuestionOptions> CREATOR = new Creator<QuestionOptions> () {
@Override
public QuestionOptions createFromParcel(Parcel in) {
return new QuestionOptions (in);
}
@Override
public QuestionOptions[] newArray(int size) {
return new QuestionOptions[size];
}
};
public QuestionOptions (OperationType operationType, int digitCount, boolean timerEnabled) {
this.operationType = operationType;
this.digitCount = digitCount;
this.timerEnabled = timerEnabled;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
boolean[] array = {timerEnabled};
dest.writeBooleanArray (array);
dest.writeInt (digitCount);
dest.writeSerializable (operationType);
}
Когда я запускаю свое приложение, оно падает с RuntimeException
в соответствии:
operationType = (OperationType)in.readSerializable ();
в QuestionOptions(Parcel in)
конструктор. В сообщении об ошибке "Parcelable обнаружена исключительная ситуация IOException при чтении объекта Serializable (name =)". Я попытался поискать это на SO, и я вижу этот вопрос, однако, об использовании списков, и у меня есть enum. Как я могу это сделать?
2 ответа
Как упомянул Блэкбелт, порядок чтения / записи имеет значение.
Вы можете использовать строковое представление перечисления, чтобы записать его в пакет. Для записи логических переменных вы можете использовать writeByte(). Я положил здесь ответ из вашего предыдущего поста:
protected QuestionOptions(Parcel in) {
this.operationType = OperationType.valueOf(in.readString());
this.digitCount = in.readInt();
this.timerEnabled = in.readByte() != 0;
}
а также
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.operationType.name());
dest.writeInt(this.digitCount);
dest.writeByte((byte) (this.timerEnabled ? 1 : 0));
}
Вы должны прочитать содержимое из Parcel
Возьмите объект в том же порядке, в котором вы его записали. Сначала логический массив, затем int, а затем значение enum. это
protected QuestionOptions(Parcel in) {
boolean[] array = new boolean[1];
in.readBooleanArray (array);
timerEnabled = array[0];
digitCount = in.readInt ();
operationType = (OperationType)in.readSerializable ();
}
должен сделать это