尝试在 onDestoryView() 之外保留片段视图的引用时发生内存泄漏

Memory leak while trying to hold a reference of Fragment view beyond onDestoryView()

我想从 FragmentA (RootFragment) 转到 FragmentB 但我不想重新创建 FragmentA 的视图从 FragmentB 返回。

我正在使用 Jetpack Navigation 在 Fragment 之间导航。

为了达到上述目的,我有一个片段Fragment是这样的:

class RootFragment : DaggerFragment() {
    private var viewToRestore: View? = null


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return if (viewToRestore != null) {
            viewToRestore!!
        } else {
            return inflater.inflate(R.layout.fragment_root, parent, false)
        }
    }

    override fun onDestroyView() {
        viewToRestore = this.view
        super.onDestroyView()
    }

    override fun onDestroy() {
        super.onDestroy()
    }    
}

但是一旦我到达具有属性 viewToRestore[=29] 的 FragmentBFragmentA (RootFragment) 就会泄漏=].

有没有可以不泄漏但达到相同目标的解决方案?

您遇到的问题是 Jetpack 导航的问题,因为您无法在转到另一个片段时添加,您只能替换:

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment_container, FragmentB.newInstance())
        .addToBackStack(null)
        .commit()

supportFragmentManager.beginTransaction()
        .add(R.id.fragment_container, FragmentB.newInstance())
        .addToBackStack(null)
        .commit()

这是replaceadd的区别。

我搜索了很多,我猜jetPack导航不支持add而不是replace,所以我建议不要在不重新创建第一个片段很重要的时候使用导航

泄漏是误报。从 Fragment 的角度来看,保留您在 onCreateView 和 return 中创建的 View 是完全可以的,前提是您的 Fragment 没有保留或以其他方式保留的时间长于用于创建的 Context创建视图是活的。