2012-05-16 72 views
7

好吧,我創建了一個Fragment一些UI(夫婦文本框和東西),我用setRetainInstance因爲進出口運行的AsyncTask來查詢服務器(要求只能用一次發送),我需要的結果爲AsyncTask。所以我的問題是: 用UI保留整個片段是錯誤的嗎?我看到一些例子,其中人們使用額外的Fragment來使用setRetainInstance但是..有沒有什麼錯誤不使用額外的? 如果使用setRetainInstance時出現問題,爲什麼?在文檔中找不到關於此的任何信息。setRetainInstance片段與UI的Android

回答

-1

如果你鎖定你的方向,那麼你應該沒問題。否則,如果您保留與特定活動實例關聯的小部件,則最終可能會發生內存泄漏。

+0

但不是與片段相關的小部件?也許我錯過了Fragments的工作原理。 – Raykud

+1

即使方向鎖定,這可能會有問題。 Android爲任何配置更改重新創建視圖。而配置更改可以是顯示旋轉(通常情況下),語言更改,鍵盤連接/分離等。照顧屏幕旋轉並不能解決整個問題。 – sstn

2

即使您使用setRetainInstance(true),當您旋轉時(您將調用onDestroyView,然後onCreateView),您的片段仍然會重新創建它的視圖。只要您不保留對過去onDestroyView的視圖的引用,就不會有任何舊活動的泄漏。最好的方法是明確地清空onDestroyView中的引用,但onCreateView中的代碼通常會覆蓋這些引用。

網上有很多例子(包括一些官方的例子),其中人們使用單獨的片段(無視圖)來保留數據。假設我上面說的是正確的,那麼這是不必要的(爲了防止泄漏)。在很多情況下,如果您使用一個單獨的片段,而這個片段的責任僅僅是處理數據而不擔心UI,那麼您可能會得到更簡潔的代碼/架構。

您可以通過using Eclipse MAT旋轉後檢查活動環境是否正在泄漏。