В onSaveInstanceState()
:
// departures is instance of Departures which extends ArrayList bundle.putSerializable("departures", departures);
В onRestoreInstanceState
:
departures = (Departures) state.getSerializable("departures");
Когда я поворачиваю экран, активность перезапускается, и состояние восстанавливается. Он работает нормально. Если я покину мероприятие, через некоторое время Android удалит его из памяти и сохранит его состояние. Когда я вернусь к нему, он сбой в onRestoreInstanceState
:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to cz.fhejl.pubtran.Departures
Теперь getSerializable
возвращает ArrayList
, а не Departures
.
Редактировать: вот как выглядит Departures.java: http://pastebin.com/qc3QfrK7
Проблема, которую вы видите, вызвана тем, как Android сглаживает объекты. Внутри он будет вызывать Parcel#writeValue(Object)
который имеет длинную цепочку if / else, а if (o instanceof List)
– перед instanceof Serializable
. Так как Departures
являются List
он будет помещать его в список вместо него, а когда он отбрасывает данные, он не знает, что это особый вид списка.
Вам нужно использовать то, что не расширяет List
чтобы обойти эту проблему.
Я знаю, что я немного опаздываю на этот, но столкнулся с подобной проблемой с массивом сериализуемых.
Я сделал это, обернув массив внутри собственного собственного класса.
private class ArrayHolder implements Serializable{ public Serializable[] _myArray; public ArrayHolder(Serializable myArray){ _myArray = myArray; } }
Затем, чтобы сохранить все, что я сделал, было
bundle.putSerializable("name",new ArrayHolder(arrayToBeSaved));
При десериализации:
ArrayHolder arrayHolder = (ArrayHolder) bundle.getSerializable("name"); arrayRecovered = arrayHolder._myArray;
Я не знаю, ПОЧЕМУ это работает, но это так.