2014-07-15 38 views
1

问候,将对象放入包

我有一个游戏,我想保存在画布上移动到一个包中的对象(creatues),所以,当有人暂停/离开应用程序,对象可以留在他们是。我看过LunarLanding游戏,他们将航天飞机的坐标保存为捆绑包并从它们读取,我想要做同样的事情(如果没有更好的方法),但我有自定义类型的对象,我我不确定如何保存它们并从包中读取。

我可以单独保存对象的所有部分并将它们放回到一起,但是我有很多对象,那只会是很难看的代码。

如果我可以将一个对象保存到一个包中,那就太好了,但到目前为止,我还没有在网上搜索关于如何这样做的运气。

我也在考虑对我的对象实施Parcelable,但我想知道是否有其他方法。

有什么建议吗?
谢谢!

+0

你这是什么意思捆绑? SharedPreference? –

+0

不,像一个包来存储当前数据[link](http://developer.android.com/reference/android/os/Bundle.html) – Pavle37

+0

他意味着通过保存实例状态包发送数据状态包 – EpicPandaForce

回答

1

从技术上讲,如果我没有记错的话,onSaveInstanceState()方法主要只在方向改变时被调用。如果你想持久化数据,你应该使用onPause()或onStop()回调函数,并且序列化游戏状态。

你可以通过将状态存储在SQLite数据库中(看起来是多余的)来做到这一点,或者让它可以通过实现Serializable interface来序列化跟踪实体的对象,并保存对象到一个文件。

连载:

@Override 
public void onPause() 
{ 
    super.onPause(); 
    FileOutputStream out = null; 
    try 
    { 
     out = openFileOutput("GameModelBackup",Context.MODE_PRIVATE); 

     try 
     { 
      ObjectOutputStream oos = new ObjectOutputStream(out); 
      oos.writeObject(gm); 
     } 
     catch(IOException e) 
     { 
      Log.d(this.getClass().toString(), e.getMessage()); 
     } 
    } 
    catch(FileNotFoundException e) 
    { 
     Log.d(this.getClass().toString(), e.getMessage()); 
    } 
    finally 
    { 
     try 
     { 
      if(out != null) out.close(); 
     } 
     catch(IOException e) 
     { 
      Log.d(this.getClass().toString(), e.getMessage()); 
     } 
    } 
} 

反序列化:

@Override 
public void onResume() 
{ 
    super.onResume(); 
    FileInputStream in = null; 
    try 
    { 
     in = openFileInput("GameModelBackup"); 
     ObjectInputStream oos = new ObjectInputStream(in); 
     try 
     { 
      gm = (GameModel)oos.readObject(); 
     } 
     catch(ClassNotFoundException e) 
     { 
      gm = null; 
     } 
    } 
    catch(IOException e) 
    { 
     Log.d(this.getClass().toString(), e.getMessage()); 
    } 
    finally 
    { 
     try 
     { 
      if(in != null) in.close(); 
     } 
     catch(IOException e) {} 
    } 
} 
+0

这基本上是提问者需要的,所以我不确定downvote是什么。如果你想要一个Parcelable类,使用http://parcelabler.com我想我应该提到这一点,但在这种情况下它并不是很有用。 – EpicPandaForce

+0

(顺便说一句,当你的进程在低内存条件下被终止时,也会调用'onSaveInstanceState()')。 – EpicPandaForce

2

基本上,你有2个选项

1 - 实施Serializable,真正实现简单,但是有一个不好的缺点是性能。

2 - 实施Parcelable,速度非常快,但你需要实现解析器方法(writeToParcel()),基本上你不得不手动序列化,但事后包会自动调用它,你并会产生一个更performatic系列化。

+1

如果你走的是Parcelable路线,请查看http://parcelabler.com以自动实现Parcelable界面的所有内容 – EpicPandaForce

+0

我想尽量多,但这是唯一的方法来保存我的对象,以便当他人离开时只是把应用程序放入后台并恢复它? – Pavle37

+0

如果你的活动被杀死,这是必需的。 –