[英]getSerializable returns different types depending on how app exited
我需要将一个int[][]
保存到Bundle
以便在onSaveInstanceState()
期间保存并在onCreate()
上恢复。 首先,我决定让它直截了当,并将2D阵列压平成1D并在负载时展开。 一切都很好。
我决定找一个更简单的方法。 我被告知2D数组是可序列化的,所以我做了这样的事情:
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[][]
这让我很困惑。 因此,无论何时屏幕方向发生变化(也可能是其他情况), getSerializable
返回可以getSerializable
转换为2D数组(可能是Serializable
)的内容。 但每当应用程序被杀死时,它都会返回无法投射的内容。 是什么导致了这种奇怪的行为,有没有办法绕过它?
是什么导致了这种奇怪的行为......?
看来这是Parcel
实现中的一个错误,我建议阅读#6评论,其中包含对bug性质的非常好的解释。
..有没有办法绕过它?
以下代码应该有效:
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.