getSerializable根据app退出的方式返回不同的类型

时间:2015-12-16 20:05:33

标签: java android arrays types casting

我需要将_exit保存到int[][],以便在Bundle期间保存并在onSaveInstanceState()上恢复。首先,我决定让它直截了当,并将2D阵列压平成1D并在负载时展开。这一切都很好。

我决定找一个更简单的方法。我被告知2D数组是可序列化的,所以我做了类似的事情:

onCreate()

其中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") ); } 行,它是:

getSerializable

这让我很困惑。因此,无论何时屏幕方向发生变化(可能还有其他内容),java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][] 都会返回可以转换为2D数组的内容(可能是getSerializable)。但每当应用程序被杀死时,它都会返回无法投射的内容。是什么导致这种奇怪的行为并且有办法绕过它?

1 个答案:

答案 0 :(得分:1)

  

是什么导致了这种奇怪的行为......?

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

  

..有没有办法绕过它?

以下代码应该有效:

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