2015-03-13 34 views
0

在我的应用程序(这是一种游戏),我有一个“敌人”类,例如像这样:恢复定制的ArrayList对象

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); 

而且从捆绑在还原的时候,我有这样的:

enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies"); 

现在,它似乎恢复的ArrayList(我可以检查它的大小,它始终是正确的 - 即相同尺寸从捆绑包中恢复,就像保存到捆绑包时一样。

我还记录了例如ArrayList的第一个索引,并且确定它列出了敌方实例在那里。然而,如果我试图在恢复后的任何时间操作ArrayList,我会得到一个异常,告诉我我试图对一个空对象(enemyList)执行[任何操作]。

如果我只是填充列表自己,所以有类似:

enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies"); 
enemyList.add(bird); 
enemyList.add(bee); 

然后一切正常。

我假设这与事实有关,敌人的超类没有序列化的事实?但是,如果我连载这个,我得到一个'notSerializableException'错误。

请注意,我并不太在意将实际的Enemy对象保存/还原到Bundle,我可以手动处理。相反,我只是想让列表处于与原来状态相同的状态。我认为存储在ArrayList中的内容仅仅是对所讨论对象的引用,因此我无法弄清楚为什么会发生这种情况?

任何想法我做错了还是有更好的方法来实现我想要实现的?

+0

相反,我只是想列表处于相同的状态,你的意思是你得到正确的值,但用户界面没有更新? – 2015-03-13 14:45:22

+0

为什么将列表保存到'Bundle'? – Xcihnegn 2015-03-13 14:46:17

+0

@Xcihnegn,因为我需要它处于和以前一样的状态。这是为了保持游戏状态,如果系统杀死了应用程序(例如,用户在游戏过程中接到电话,并在操作系统杀死应用程序一小时后回到该状态 - 我需要保留所有内容以便它可以接收它保留的地方 - 保存实际对象的当前状态不是问题,但我不知道如何让列表完好无损)。 – Zippy 2015-03-13 14:52:13

回答

0

在Android中这样做的推荐方法是让您想要保持的对象成为可分段。这是一种特定于Android的序列化。 看看官方文档here

+0

感谢@RaresBarbantan但问题不是如何保存一个对象的状态,我已经可以做到这一点(其实,我过去曾使用Parcelable,但目前通过保存我想要的属性手动执行此操作而不是使整个对象Parcelable)。我目前面临的问题是如何向bundle中发送和检索ArrayList(全部是自定义对象)。我只需要ArrayList处于相同的状态,并能够访问其中的对象(无论如何应用程序重新启动时都会重新创建对象,因此无需保存它们)。 – Zippy 2015-03-13 15:03:47

+0

这正是Parcelable的目的。即使Bundle类被定义为“从字符串值到各种Parcelable类型的映射” – 2015-03-13 15:10:31

+0

您是否认为使用'serializable'无法实现? (我读过几篇文章,建议使用这个)。我目前不使用Parcelable,如果可能,宁愿保留它。 – Zippy 2015-03-13 15:18:30