繁体   English   中英

ClassCastException发生在onRestoreInstanceState中

[英]ClassCastException occurs in onRestoreInstanceState

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

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

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

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

现在,您的活动将在您离开后立即销毁。 启动相关活动,按“主页”按钮,然后切换回应用程序应触发ClassCastException

与此同时,Ted Hopp建议使用

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

应避免崩溃应用程序。

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

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

它会阻止java.lang.ClassCastException并保存元素顺序。

要恢复Stack,您可以使用下一个代码:

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

它的工作原理是Vector,Stack,ArrayList都在扩展Collection,你可以将你的序列化对象转换为Collection并传递给Stack或Vector addAll()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM