2015-03-13 79 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