我需要将_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
)。但每当应用程序被杀死时,它都会返回无法投射的内容。是什么导致这种奇怪的行为并且有办法绕过它?
答案 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);
}