2014-03-19 44 views
0

我有一個HashMap,其中包含與特定活動相關的數據。 數據應該從服務器獲取,並且相當大,所以我不想在特定的活動中獲取它。相反,我將主活動中的所有數據提取到自定義類中,然後創建一個HashMap來保存所有對象並將其保存在我的Application類中。應用程序運行時保留HashMap數據 - Android

當用戶進入其他活動時,通過調用早先從應用程序類創建的HashMap,無需等待即可完成數據的準備。

除了有些時候應用程序在後臺很長一段時間,它的所有工作都很好,存儲在HashMap中的數據正在被Android初始化。

我讀過在Apllication類中存儲對象是壞的,我不能避免這個錯誤,所以我的問題是做這個過程的正確方法是什麼? 我需要一個解決方案,只要有我的應用程序的一個實例,就會保持我的HashMap對象處於活動狀態。

+0

您需要維護序列化的catch來長時間保存數據。 –

回答

2
I have a HashMap which contains data that is relevant to a specific Activity. 

如果是這樣的話,你爲什麼不希望保留HashMap爲您的活動實例變量?在Application對象中存儲特定的Activity的數據不是很好的面向對象的設計。

如果您需要在Activity銷燬並創建時將數據保存在HashMap中,可以將其保存在onSaveInstanceState()中。

+0

實例變量選項: 如果用戶在第一次打開應用程序時沒有導航到該Activity,並且在應用程序處於後臺時一兩天之後,他想要輸入該Activity?數據是否仍然存在? onSaveInstanceState()選項: 我的HashMap包含自定義類對象,我該如何將它保存在一個包中? –

+0

如果活動已被銷燬(即後退按鈕或應用程序退出),則可以將其保存在onSaveInstanceState()中。如果只是暫停(即按下主頁按鈕),它仍然會在內存中。如果自定義對象實現了Serializable接口,則可以使用putSerializable()將自定義對象存儲在一個包中。 –

+0

如果我將在每個Activity上創建一個Application類的實例,該怎麼辦?它會阻止它被銷燬嗎? –

0

其中一種可用的方法是使用保留的「無頭」Fragment來將HashMap數據保留在Activity休閒娛樂中。據android docs這樣Fragment的生命週期是完全不同的:

  • 的onDestroy()不會被調用(但onDetach()仍然是,因爲該片段將被從其當前活動分開)。
  • onCreate(Bundle)將不會被調用,因爲片段不會被重新創建。
  • onAttach(Activity)and onActivityCreated(Bundle)仍將被調用。

因此,當您的Activity死於配置更改等,您的Fragment不會。當重新創建Activity時,它可以請求保留Fragment以獲得一段「緩存」數據。 Read this,如果你喜歡這樣做。

我想到的另一種方法是將您的數據緩存在數據庫或文件中,但我猜這可能是一種矯枉過正。

+0

將我的應用程序從Activity切換到Fragments將會像重新寫一遍,我寧願避免它。 使用數據庫將會非常複雜,因爲我使用自定義類對象 –

+0

您不必重寫整個。保留的無頭碎片不需要顯示任何東西。基本上,它可能就像一個隱形的容器,在活動中存活並保留數據,而您的應用程序根本沒有被銷燬(而您的活動可以多次)。 – Drew

0

該數據應該從服務器提取,並且相當大,所以我不想 想要在該特定活動中獲取它。

Mb更好地使用Sqlite的數據存儲的目的,因爲Android設備沒有無限的資源?

相關問題