2012-08-07 72 views
5

怎樣才能最好的一個片段內,其活性經歷一個的onCreate保留數據/銷燬週期像旋轉?Android的碎片保存數據

在我們的設置,我們必須從我們的服務器加載到片段自定義列表適配器潛在的大名單,我們希望通過不使它們旋轉重裝理順UX。我們設置片段的問題retainInstance = true;是因爲我們的適配器引用了原始活動的上下文,因此會泄漏內存。我們能否將數據存儲在片段中並重新創建適配器;如果是這樣的話,那麼真的是適當的做法?

接下來的想法是將數據存儲到一個會話單對象,並呈現陳舊數據的一些問題旋轉後取回,但我們可以很容易地克服。

另一種選擇我看到的,好像它是*最好的解決辦法,是將數據保存到一個包,並還原成旋轉後的新片段;但是,我們有很會需要幾個對象存儲整個應用程序和我們的一些對象是複雜的,包含列表,多種類型,並且將是一個痛苦,使parcelable。有沒有更好的解決方案,還是我們必須咬緊牙關,讓它們可以Parcelable?

+0

如何將應用程序上下文傳遞給適配器而不是活動?如果你沒有使用不同主題的上下文來進行棘手的事情,那麼我建議使用應用程序上下文,因爲這在應用程序的整個生命週期中都不會改變。 – 2012-08-08 03:27:01

回答

4

只是防止活動從旋轉(等)重建本身。將

android:configChanges="keyboardHidden|orientation|screenSize" 

添加到您的AndroidManifest.xml中的Activity定義中。那麼就沒有必要保存任何旋轉。

編輯:

如果你不喜歡這種解決方案,然後你有沒有選擇,只能使用機制的onSaveInstanceState。如果你有複雜的數據,只要將你的類設爲Serializable並將它們添加到Bundle中即可。

+3

因爲這在Android文檔和其他地方非常令人氣餒,所以我們並不認爲這是可行的選擇。 http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance() – 2012-08-07 20:49:40

+2

然後你別無選擇,只能使用onSaveInstanceState機制。如果你有複雜的數據,只要將你的類設爲Serializable並將它們添加到Bundle中即可。 – 2012-08-07 20:58:26

+1

如果您將其作爲答案,它將被接受爲正確的。最好的解決方案是使數據可以分段並使用保存實例狀態,但由於複雜性,可以通過使用分段的保留實例功能和更仔細地管理我們的分段資源以確保我們不保留對舊活動的引用/視圖(作爲最佳實踐和提高性能,這應該完成)。 – 2012-08-10 18:39:36

0

根據http://developer.android.com/guide/topics/resources/runtime-changes.html,you完全可以在片段保存數據,只要它沒有關聯活動,視圖等。Bundle實際上並不適用於大量數據,並且序列化速度很慢,因此片段對於大量數據來說是理想的。

它可能無法爲你完全恢復同捆的活動狀態,該系統節省了您的的onSaveInstanceState()回調,它的目的不是要攜帶大型物體(如位圖)和它內部的數據必須被序列化然後反序列化,這會消耗大量的內存並使配置變化緩慢。在這種情況下,當您的活動由於配置更改而重新啓動時,您可以通過保留片段來減輕重新初始化活動的負擔。該片段可以包含對要保留的有狀態對象的引用。