【发布时间】:2015-03-13 14:37:56
【问题描述】:
在我的应用程序(这是一个游戏)中,我有一个“敌人”类,例如:
public class Enemy extends Sprite implements Serializable {
public Enemy(EnemyType type){
super();
}
}
然后我像这样声明了一个 ArrayList:
ArrayList<Enemy> enemyList = new ArrayList<Enemy>();
我可以添加敌人:
enemyList.add(bird);
enemyList.add(bee);
当保存到捆绑包时,我简单地说:
bundle.putSerializable("Enemies", enemyList);
当从 Bundle 中恢复时,我有这个:
enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies");
现在,它似乎恢复了数组列表(我可以检查它的大小并且它总是正确的 - 即,从包恢复时的大小与保存到包时的大小相同。
例如,我还记录了 ArrayList 的第一个索引,果然它列出了存在的敌人实例。
但是,如果我尝试在恢复后的任何时间操作 ArrayList,我会收到一个异常,告诉我我正在尝试对 Null 对象(enemyList)执行 [whatever action]。
如果我只是自己填充列表,那么有类似的内容:
enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies");
enemyList.add(bird);
enemyList.add(bee);
然后一切都按预期进行。
我假设这与 Enemy 的超类没有序列化这一事实有关?但是,如果我对此进行序列化,则会收到“notSerializableException”错误。
请注意,我并不太担心将实际的 Enemy 对象保存/恢复到 Bundle,我可以手动处理。相反,我只希望列表处于与以前相同的状态。而且我认为存储在 ArrayList 中的只是对相关对象的引用,因此我无法弄清楚为什么会发生这种情况?
任何想法我做错了什么或有更好的方法来实现我想要实现的目标?
【问题讨论】:
-
我只是希望列表处于与以前相同的状态,您的意思是您获得了正确的值但 UI 未更新?
-
为什么要将列表保存到
Bundle? -
@Xcihnegn,因为我需要它处于与以前相同的状态。这是为了在系统终止应用程序时保留游戏状态(例如,用户在游戏期间接到电话,在操作系统终止应用程序后一小时后返回 - 我需要保留所有内容以便它可以接听它停止的地方 - 保存实际对象的当前状态不是问题,但我不知道如何保持列表完好无损)。
-
@LochanaRagupathy - 我真的不确定,我想这就是可能发生的事情。我所知道的是,在它恢复后,我可以立即访问它,但是一旦我切换回游戏正常,它就会看到它为空.....
-
配置更改时保存数据,有更好的方法是将数据保存到另一个保留状态的片段
标签: android serialization arraylist bundle custom-object