尝试在 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] 的 FragmentB,FragmentA (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()
这是replace
和add
的区别。
我搜索了很多,我猜jetPack导航不支持add
而不是replace
,所以我建议不要在不重新创建第一个片段很重要的时候使用导航
泄漏是误报。从 Fragment 的角度来看,保留您在 onCreateView
和 return 中创建的 View 是完全可以的,前提是您的 Fragment 没有保留或以其他方式保留的时间长于用于创建的 Context创建视图是活的。
我想从 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] 的 FragmentB,FragmentA (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()
这是replace
和add
的区别。
我搜索了很多,我猜jetPack导航不支持add
而不是replace
,所以我建议不要在不重新创建第一个片段很重要的时候使用导航
泄漏是误报。从 Fragment 的角度来看,保留您在 onCreateView
和 return 中创建的 View 是完全可以的,前提是您的 Fragment 没有保留或以其他方式保留的时间长于用于创建的 Context创建视图是活的。