5

onSaveInstanceState()

// departures is instance of Departures which extends ArrayList
bundle.putSerializable("departures", departures);

onRestoreInstanceState

departures = (Departures) state.getSerializable("departures");

当我旋转屏幕时,Activity 会重新启动并恢复其状态。它工作正常。如果我离开 Activity,一段时间后,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

4

2 回答 2

6

您看到的问题是由 Android 扁平化对象的方式引起的。在内部,它将调用Parcel#writeValue(Object)具有长链 if/else 和if (o instanceof List)before instanceof Serializable。因为Departuresis aList它会将其作为一个列表而不是在解包数据时它不知道它是一种特殊类型的列表。

您需要使用不扩展 a 的东西List来解决该问题。

于 2012-09-08T22:46:01.193 回答
4

我知道我在这个方面有点晚了,但我遇到了一个与一系列可序列化数组类似的问题。

我通过将数组包装在我自己的私有类中来使其工作。

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;

我不知道为什么它有效,但它确实有效。

于 2012-10-15T15:48:09.493 回答