java - getSerializable 根据应用程序的退出方式返回不同的类型

标签 java android arrays types casting

我需要保存一个 int[][]进入 Bundle所以它可以在 onSaveInstanceState() 期间保存并在 onCreate() 上恢复.首先,我决定让它变得简单明了,将 2D 数组展平为 1D 并在加载时展平。一切正常。

我决定寻找一种更简单的方法。有人告诉我二维数组是可序列化的,所以我做了这样的事情:

public void onSaveInstanceState(Bundle savedInstanceState) {

    savedInstanceState.putSerializable("CELLS_STATE",universe.getUniverse());

    super.onSaveInstanceState(savedInstanceState);
}//onSaveInstanceState

哪里universe.getUniverse()返回 int[][] .

正在 onCreate() 内重新加载:

    if(savedInstanceState != null)
    {//save data exists, reload it
        universe = new Universe( (int[][])savedInstanceState.getSerializable("CELLS_STATE") );
    }

这里是陷阱。如果我运行该程序并转动我的手机以使屏幕改变方向,它会加载得很好。

但是,当我按下主页按钮然后使用应用程序 killer (在我的例子中是 Battery Doctor)终止应用程序并尝试从菜单中再次启动它时,它崩溃了,我只能从第二次尝试启动它,并且保存的状态丢失。该崩溃中给出的错误指向带有 getSerializable 的行我在上面指定了,它是:

java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]

这让我很困惑。因此,每当屏幕方向发生变化(可能还有其他变化)时,getSerializable返回可以转换为二维数组的内容(可能是 Serializable )。但是每当应用程序被杀死时,它都会返回一些无法转换的东西。是什么导致了这种奇怪的行为,有没有办法绕过它?

最佳答案

What causes such a strange behavior...?

这似乎是 Parcel 实现中的一个错误,我建议阅读评论 #6其中包含对错误性质的非常好的解释。

.. and is there a way to bypass it?

下面的代码应该可以工作:

if (savedInstanceState != null) {
    final Object[] objects = savedInstanceState.getSerializable("CELLS_STATE");
    final int[][] cells = new int[objects.length][];

    for (int i = 0; i < objects.length; i++) {
        cells[i] = (int[]) objects[i];
    }

    universe = new Universe(cells);
}

关于java - getSerializable 根据应用程序的退出方式返回不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34321094/

相关文章:

javascript - 使用 Mongoose.js 按嵌套数组中的字段排序

Java XML getElementsByTagName() 函数

java - Hibernate @Where 注解语法问题

java - Log4j 不会在删除时重新创建文件

jquery - 根据最高值从数组中获取随机元素

java - 如何将元素添加到自定义类型的数组中

java - 单击链接时 Android WebView 打开 uTorrent 应用程序

java - 在 SQlite 数据库中添加新行然后在 ListView 中添加新行时,所有列表行在自定义 ListView 中重复

Android Studio 模拟器数小时未运行

android - setOnClickListeners 用于动态创建的复选框