对UI片段中保留片段的引用。旋转屏幕后,如何从内存中删除UI片段?

时间:2017-02-14 18:27:10

标签: android android-fragments memory-management screen-rotation

我正在阅读FragmentRetainInstance sample. RetainedFragment mWorkFragment中有变量UiFragment。那么在旋转屏幕后如何从内存中删除UiFragment?据我所知,mWorkFragment是对屏幕轮换和其他配置更改后存活的内容的引用。

更新#1

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

启动GC:

enter image description here

堆转储:

enter image description here

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你链接的样本中的UiFragment没有泄露。它确实包含对RetainedFragment的引用,该引用在配置更改后仍然存在,但该引用无关紧要。 GC将从GC根开始,然后从该对象遍历对象内部的引用。由于UiFragment不是从生活中的东西(如RetainedFragment)引用的,因此它将在活动对象的层次结构之外,并且有资格进行垃圾收集。

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