【发布时间】:2016-03-23 02:59:47
【问题描述】:
我需要将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 就会返回可以转换为 2D 数组的内容(可能是 Serializable)。但是每当应用程序被杀死时,它都会返回一些无法投射的东西。是什么导致了这种奇怪的行为,有没有办法绕过它?
【问题讨论】:
标签: java android arrays types casting