繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM