[英]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.