尝试保存片段视图的引用超出onDestoryView()时内存泄漏

问题描述 投票:1回答:2

我想从Fragment(Root Fragment)转到Fragment但是我不希望从FragmentB返回后重新创建FragmentA的视图。

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

为了实现上述目标,我有一个像这样的片段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属性到达Fragment B,FragmentA(RootFragment)就会泄漏。

enter image description here

任何可以在没有泄漏的情况下工作但实现相同目标的解决方

android android-fragments memory-leaks android-navigation leakcanary
2个回答
2
投票

泄漏是误报。从Fragment的角度来看,保持你在onCreateView中创建的View并稍后返回它是完全没问题的,条件是你的Fragment没有保留或者保持的时间长于用于创建视图的Context。


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,所以我建议不要使用导航,重要的是不要重新创建第一个片段

© www.soinside.com 2019 - 2024. All rights reserved.