ClassCastException在onRestoreInstanceState中发生

ClassCastException随机发生,以恢复onRestoreInstanceState()中的Vector。 通常恢复vector完成,但有时发生exception。

我认为这种情况发生在活动进入背景并被摧毁时,但我不确定。

有任何想法吗? 谢谢。

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); } 

添加:

我忘了附上exception日志。 那是

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

Solutions Collecting From Web of "ClassCastException在onRestoreInstanceState中发生"

我使用下一个代码来恢复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()方法。

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

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

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

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

同时,特德·霍普的build议使用

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

应该避免崩溃的应用程序。