尝试在onDestoryView()

时间:2019-03-08 07:21:27

标签: android android-fragments memory-leaks android-navigation leakcanary

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

我正在使用Jetpack导航在片段之间导航。

为了实现上述目标,我有一个像这样的片段片段:

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 片段B 时, FragmentA (RootFragment)正在泄漏。

enter image description here

有没有解决方案但可以实现相同目标的解决方案?

2 个答案:

答案 0 :(得分:0)

您遇到的问题是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,因此,当重要的是不要重新创建第一个片段时,我建议不要使用导航

答案 1 :(得分:0)

泄漏是误报。从Fragment的角度来看,最好保留在onCreateView中创建的View,然后在不保留Fragment或将其保留的时间长于用于创建视图的Context的情况下,将其返回。活着。