我需要保存一个 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/