簡體   English   中英

對 UI 片段中保留片段的引用。 旋轉屏幕后如何從內存中刪除UI片段?

[英]A reference to a retained fragment in a UI fragment. How can the UI fragment be deleted from memory after I rotate the screen?

我正在閱讀FragmentRetainInstance 示例。 RetainedFragment mWorkFragment中有變量RetainedFragment mWorkFragment UiFragment 那么如何在旋轉屏幕后從內存中刪除UiFragment呢? 據我所知, mWorkFragment是對在屏幕旋轉和其他配置更改中幸存下來的東西的引用。

更新 #1

我旋轉屏幕並按下Initiate GC,然后按下Dump heap。 我看到UiFragment實例的數量是 1。為什么? 我希望看到當前方向為 2:1,上一個方向為 1。

啟動GC:

在此處輸入圖片說明

堆轉儲:

在此處輸入圖片說明

正如我在評論中所說,您鏈接到的樣本中的 UiFragment 沒有泄露。 它確實持有對 RetainedFragment 的引用,該引用在配置更改后仍然存在,但該引用無關緊要。 GC 將從一個 GC 根開始,並從那里按照它在對象內找到的引用遍歷對象。 由於 UiFragment 不是從存在的東西(如 RetainedFragment)引用的,因此它將處於活動對象的層次結構之外,並且有資格進行垃圾收集。

如果您想查看內存泄漏,請在您鏈接的示例中刪除mProgressBar = null; 來自 RetainedFragment 的 onDetach() 回調。 通過此更改, RetainedFragment 將持有對 UiFragment 的引用(實際上是舊活動及其所有數據),使舊 Context 實例保持活動狀態,至少在調用 RetainedFragment 的 onActivityCreated() 回調之前(在 onActivityCreated 內部) () mProgressBar 將被清除並指向恢復的 UiFragment 的 ProgressBar)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM