2014-07-15 75 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

如果你的活動被殺死,這是必需的。 –