当Don不保持活动时,向量恢复为ArrayList onRestoreInstanceState

时间:2015-09-24 09:07:30

标签: android

简单的测试用例100%可重复。 尝试启用"不要保持活动"在开发者选项中。

1 - 在您的活动中成为会员" Vector" (或Vector的任何子类)。

2 - onSaveInstanceState使用" putSerializable"捆绑你的矢量成员

3 - 转到其他活动(例如按下按钮并打开新活动)

4 - 在新活动中,按后退按钮完成操作。

5 - 使shure从您在onCreate中收到的savedInstanceState包中获取向量。

6 - 崩溃!

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Vector

我做错了什么,还是在平台上坏了?

1 个答案:

答案 0 :(得分:4)

在通过捆绑包时,所有列表都将重建为ArrayList。

在活动之间传输数据时,所有数据实现Serializable都将被写入字节流,并在新活动中重新创建它们。

当您调用bundle.getSerializable()时,它将使用readValue()中的android.os.Parcel来获取值。在Parcel.java的源代码中,当对象是List的子类时,它使用readArrayList()方法创建List,它不关心它是上一个活动中的Vector还是其他。

public final Object readValue(ClassLoader loader) {
    int type = readInt();

    switch (type) {
        case VAL_STRING:
            return readString();
            ...
        case VAL_LIST:
            return readArrayList(loader);
            ....
    }
}