对 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 sample. UiFragment中有变量RetainedFragment mWorkFragment。那么旋转屏幕后内存中的UiFragment怎么删除呢?据我所知,mWorkFragment 是指在屏幕旋转和其他配置更改时仍然存在的东西。

更新#1

我旋转了屏幕并按下了Initiate GC,然后按下了Dump heap。我看到 UiFragment 个实例的数量是 1。为什么?我希望看到 2:当前方向为 1,之前方向为 1。

启动GC:

堆转储:

正如我在评论中所说,您链接到的示例中的 UiFragment 没有泄露。它确实包含对 RetainedFragment 的引用,该引用在配置更改后仍然存在,但该引用无关紧要。 GC 将从 GC root 开始,然后从那里遍历它在对象中找到的引用之后的对象。由于 UiFragment 不是从存在的对象(如 RetainedFragment)中引用的,它将在活动对象的层次结构之外,并且有资格进行垃圾收集。

如果您想查看内存泄漏,请在链接到的示例中,从 RetainedFragment 的 onDetach() 回调中删除行 mProgressBar = null;。通过此更改,RetainedFragment 将保留对 UiFragment 的引用(实际上是旧的 activity 及其所有数据),使旧的 Context 实例保持活动状态,至少直到 RetainedFragment 的 onActivityCreated() 回调为调用(在 onActivityCreated() 内部 mProgressBar 将被清除并指向恢复的 UiFragment 的 ProgressBar)。