【问题标题】:Android View Binding - Clear Binding in Fragment LifecycleAndroid View Binding - Fragment 生命周期中的清除绑定
【发布时间】:2020-12-14 19:16:14
【问题描述】:

为什么在 Fragment 中实现 Android View Binding 时清除 onDestroyView 中的 binding 很重要?

如文档所示,Use view binding in fragments 和 Android 架构组件 samplebindingonCreateView 中启动,并在 @ 中清除987654328@.

与在onDestroyView 中启动binding 而不清除它相比,实施此方法有什么好处?在不显式清除实例变量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
}

【问题讨论】:

    标签: android android-layout kotlin android-lifecycle android-viewbinding


    【解决方案1】:

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

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

    【讨论】:

    • 好答案,现在假设我们在适配器中使用了视图绑定,那么销毁适配器中的引用的好做法是什么?
    • @AliAkram 您不必在适配器内部执行任何特殊操作,因为它不会在多个生命周期中重用。如果在 Fragment 属性中引用适配器,则应遵循与视图绑定相同的模式,因为属性引用会阻止垃圾收集器获取适配器及其所有视图。
    • java有垃圾收集器,销毁时将对象赋值为null有用吗?
    • 片段实例在销毁后可能会被框架重用,因此如果您没有在onDestroy 中将视图引用设置为 null,它们将不必要地留在内存中,直到被其他引用替换当您的片段重新连接时。
    • 你可以阅读我链接的文章。这可能不是您真正需要担心的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多