2012-04-15 117 views
1

我正在使用ActionBar中的選項卡使用UI。在標籤之間切換時,我目前在我的Activity中管理Tab點擊事件,並使用FragmentManager根據需要調用attach和detach。分離後保存碎片UI狀態

每次連接Fragment時,我都會經歷完整的生命週期並創建一個新視圖並重新載入所有數據。我在onSaveInstanceState和onActivityCreated中使用給定的Bundle來更新gui元素(主要是列表的滾動位置)。

這工作正常,但有很多開銷。在我的情況下,列表可能有300個左右的記錄,並且在切換標籤時會有明顯的延遲。

爲了加快速度,我現在將onCreateView中的根視圖保存爲一個類變量。然後,當onCreateView被再次調用作爲附加片段的結果我測試爲我的根視圖非空值,並返回它而不是重新膨脹視圖。這個保存的視圖仍然有適當的數據集,我也繞過了在這種情況下加載數據。當然,如果Fragment在後臺被OS破壞,我仍然需要完全重建視圖和數據。

我的問題是如果這是一個有效的方法?除非有內存問題需要擔心,否則我不認爲它有什麼不利之處。

回答

1

這是不是最好的方法,這裏的原因:

當您創建的根查看第一,所有的意見都使用Activity的情況下膨脹。如果此Activity遭到破壞,然後您嘗試將Fragment重新附加到此Activity的新實例,則會出現問題。

其次,當它沒有被使用時,充滿膨脹的根視圖是一種可怕的內存使用。現在,您提到的記錄不會存儲在任何View中,而是您的列表視圖會引用您創建的適配器,並將該適配器與視圖一起保存在內存中。這是很多數據只是坐在旁邊。

現在要正確給你一個建議,你最終必須在內存使用和性能之間畫一條線,牢記如果你打算公開這個應用程序,那就是很多劣質的硬件設備。

一個選項就是你已經完成的工作,它是在分離時使用savedInstanceState變量。您可以嘗試在此Bundle中放入300條記錄,並查看其執行情況。如果數據是您創建的類,請實施Parcelable接口(請參閱documentation以瞭解如何正確實現此目的)並將其存儲在Bundle中,然後稍後檢索並創建新適配器。我強烈建議不要在附件之間保留對View的引用。

+0

謝謝你的迴應。我已經看到其他人建議隱藏一個片段,而不是調用detach,但會認爲這會產生與我的解決方案相同的內存開銷。 – 2012-04-15 17:48:11

+0

我需要確定它們的實際片段的外觀和感覺。一旦所有樣式都完成了,我會查看視圖所使用的內存,並根據該內存做出決定。對於給定的API級別,是否有可接受的內存使用準則? – 2012-04-15 17:54:27

+0

這將取決於設備硬件,而不是設備操作系統版本。如果您以前沒有閱讀過[this](http://developer.android.com/resources/articles/avoiding-memory-leaks.html)文章。 – 2012-04-15 18:07:31