繁体   English   中英

Android 视图绑定 - 片段生命周期中的清除绑定

[英]Android View Binding - Clear Binding in Fragment Lifecycle

为什么在片段中实现Android 视图绑定时清除onDestroyView中的binding很重要?

如文档所示, 在片段中使用视图绑定和 Android 架构组件示例bindingonCreateView中启动,并在onDestroyView中清除。

与启动binding而不在onDestroyView中清除它相比,实现它有什么好处? 在不显式清除实例变量binding的情况下,应在 Fragment 销毁时将其清除。

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

当 Fragment 实例本身仍在 memory 中时,Fragment 可能会多次创建和销毁其视图。 如果您没有 null 出视图引用,那么您将在onDestroyView()onCreateView()之间的时间范围内“泄漏”这些视图。 但它们并没有永久泄露,所以也许这是错误的术语。

有人说,这些观点暂时泄露也没关系。 我对生命周期的详细信息了解得不够多,无法知道它是否严格重要。 我希望有时视图被拆除的原因是 Android 试图在 memory 不在屏幕时保存它们,所以如果你挂在它们上面,你就是在颠覆它。

  • 文档中所述: once the fragment then invokes its onDestroyView() callback all references to the fragment's view should be removed, allowing the fragment's view to be garbage collected.

  • 基本上是为了避免 memory 泄漏并为我们的应用程序提供更新的视图

更深入的了解

  • 所以要真正理解发生了什么,你应该阅读片段的生命周期文档,特别是关于销毁视图和片段的部分。

  • 同样重要的是要指出片段的视图有一个单独的生命周期,该生命周期独立于片段的生命周期进行管理

  • 但是,我们仍然可以under the hood了解幕后发生的事情。 当 Fragment 不再在视图中(用户可见)并且所有退出动画和过渡都已完成时。 片段的视图将转换为它的DESTROYED state 并向它的观察者(片段)发出ON_DESTROY事件。 然后这会触发片段调用其onDestroyView()方法。 它的文档状态, The next time the fragment needs to be displayed, a new view will be created 所以我们设置_binding = null以允许创建和引用新视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM