首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onRestoreInstanceState中出现了ClassCastException

onRestoreInstanceState中出现了ClassCastException
EN

Stack Overflow用户
提问于 2012-07-01 13:57:35
回答 2查看 1.4K关注 0票数 8

在onRestoreInstanceState()中恢复向量时,ClassCastException会随机发生。一般情况下,恢复向量完成得很好,但有时也会出现异常。

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

有什么想法吗?谢谢。

代码语言:javascript
复制
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);
}

添加:

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

代码语言:javascript
复制
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-18 13:52:45

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

代码语言:javascript
复制
objects = new Vector<Object>((Collection<Object>) state.getSerializable(EXTRA_OBJECTS));

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

要恢复Stack,可以使用下面的代码:

代码语言:javascript
复制
stack = new Stack<Object>();
stack.addAll((Collection<Object>) state.getSerializable(EXTRA_STACK));

它的工作原理是向量、栈、ArrayList都在扩展集合,您可以将序列化对象强制转换为集合并传递给栈或向量addAll()方法。

票数 5
EN

Stack Overflow用户

发布于 2012-08-01 22:24:10

当活动由于内存压力而被破坏时,通常会发生这种情况。传递给onRestoreInstanceState的包似乎保留了基类的一个实例(本例中为ArrayList)。

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

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

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

与此同时,泰德·霍普的建议是使用

代码语言:javascript
复制
if (saved instanceof Stack) {
    ....
}

应该避免应用程序崩溃。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11279911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档