我正在阅读FragmentRetainInstance sample.
RetainedFragment mWorkFragment
中有变量UiFragment
。那么在旋转屏幕后如何从内存中删除UiFragment
?据我所知,mWorkFragment
是对屏幕轮换和其他配置更改后存活的内容的引用。
更新#1
我旋转屏幕并按下Initiate GC,然后按下Dump heap。我看到UiFragment
个实例的数量是1.为什么?我希望当前方向看2:1,前一个方向看1。
启动GC:
堆转储:
答案 0 :(得分:1)
正如我在评论中所说,你链接的样本中的UiFragment没有泄露。它确实包含对RetainedFragment的引用,该引用在配置更改后仍然存在,但该引用无关紧要。 GC将从GC根开始,然后从该对象遍历对象内部的引用。由于UiFragment不是从生活中的东西(如RetainedFragment)引用的,因此它将在活动对象的层次结构之外,并且有资格进行垃圾收集。
如果要查看内存泄漏,请在链接到的示例中,从RetainedFragment的inDetach()回调中删除 mProgressBar = null; 行。通过此更改,RetainedFragment将保留对UiFragment的引用(实际上是旧活动及其所有数据),使旧的Context实例保持活动状态,至少在调用RetainedFragment的onActivityCreated()回调之前(在onActivityCreated内部) ()mProgressBar将被清除并指向已恢复的UiFragment的ProgressBar)。