8

ClassCastException 随机发生以在 onRestoreInstanceState() 中恢复 Vector。一般恢复向量都可以很好地完成,但有时会出现异常。

我认为当活动进入后台并被销毁时会发生这种情况,但我不确定。

有任何想法吗?谢谢你。

Stack<LocationInfo> mLocationInfoVector;

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putSerializable("locationInfos", mLocationInfoVector);

    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState.getSerializable("locationInfos") != null) {
        @SuppressWarnings("unchecked")
        mLocationInfoVector= (Stack<LocationInfo>) savedInstanceState.getSerializable("locationInfos");
    }

    super.onRestoreInstanceState(savedInstanceState);
}

添加:

我忘了附上异常日志。那是

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack
4

2 回答 2

5

这通常发生在活动因内存压力而被破坏时。传递给 onRestoreInstanceState 的包似乎保留了基类的一个实例(ArrayList在这种情况下)。

您可以通过调整开发人员选项来重现该问题:

  1. 转到设置 | 开发人员选项
  2. 选中“不保留活动”复选框

现在,您的活动将在您离开后立即被销毁。启动有问题的活动,按下主页按钮,然后切换回您的应用程序应该会触发ClassCastException.

与此同时,Ted Hopp 建议使用

if (saved instanceof Stack) {
    ....
}

应避免使应用程序崩溃。

于 2012-08-01T14:24:10.380 回答
5

我使用下一个代码来恢复 Vector:

objects = new Vector<Object>((Collection<Object>) state.getSerializable(EXTRA_OBJECTS));

它可以防止 java.lang.ClassCastException 并保存元素顺序。

要恢复堆栈,您可以使用以下代码:

stack = new Stack<Object>();
stack.addAll((Collection<Object>) state.getSerializable(EXTRA_STACK));

它之所以有效,是因为 Vector、Stack、ArrayList 正在扩展 Collection,您可以将序列化对象转换为 Collection 并传递给 Stack 或 Vector addAll() 方法。

于 2013-02-18T05:52:44.977 回答