Android 如果我在片段中使用ViewBinding,我会在onDestoryView()之后使用NPE吗?

Android 如果我在片段中使用ViewBinding,我会在onDestoryView()之后使用NPE吗?,android,Android,我试图在片段中使用ViewBinding 首先,谷歌表示如下: 注意:片段比其视图寿命长。确保清除片段的onDestroyView()方法中对绑定类实例的所有引用。[] 因此,我编写了如下代码: private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() =

我试图在片段中使用ViewBinding

首先,谷歌表示如下:

注意:片段比其视图寿命长。确保清除片段的onDestroyView()方法中对绑定类实例的所有引用。[]

因此,我编写了如下代码:

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

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}
然后,在onDestoryView()之后,我开始担心NPE

安全吗?假设您在onDestoryView()和onDetact()之间的某个点收到网络响应

碎片比他们的观点更长寿

让我们来解释一下,假设您有片段A和B(BackStack中的A和B)相同的容器视图和相同的FragmentManager。当您将片段A替换为B时,A的所有视图元素都将被销毁,但片段A的实例仍在片段
BackStack
中活动。这意味着,如果您保留
\u binding
的值,它可能会泄漏,因为它仍然保留视图引用,但Android系统希望清除它。所以Google建议您将null分配给
\u binding
以释放视图引用

假设您在onDestoryView()和onDetact()之间的某个点收到网络响应

如果onDestroyView更新了您的UI,您不应该在它之后处理任何网络响应,因为您的片段视图不呈现给用户

碎片比他们的观点更长寿

让我们来解释一下,假设您有片段A和B(BackStack中的A和B)相同的容器视图和相同的FragmentManager。当您将片段A替换为B时,A的所有视图元素都将被销毁,但片段A的实例仍在片段
BackStack
中活动。这意味着,如果您保留
\u binding
的值,它可能会泄漏,因为它仍然保留视图引用,但Android系统希望清除它。所以Google建议您将null分配给
\u binding
以释放视图引用

假设您在onDestoryView()和onDetact()之间的某个点收到网络响应


如果onDestroyView更新了您的UI,您不应该在它之后处理任何网络响应,因为您的片段视图不存在于用户面前。

我们不能这样做吗
binding.lifecycleOwner=viewLifecycleOwner
?当然,我们可以解决生命周期问题。但是,我想在不增加额外逻辑的情况下使用它。所以我写了这个问题。谢谢。我们不能改为执行此
binding.lifecycleOwner=viewLifecycleOwner
吗?当然,我们可以解决生命周期问题。但是,我想在不增加额外逻辑的情况下使用它。所以我写了这个问题。谢谢。在处理响应之前,我最终必须检查片段的生命周期。正当然后,我需要避免NPE的逻辑。如果可能的话,我想在不添加额外逻辑的情况下使用它。所以我写了这个问题。谢谢。我建议您仍然将绑定分配给null,并在处理响应之前跟踪生命周期。最终,我必须在处理响应之前检查片段的生命周期。正当然后,我需要避免NPE的逻辑。如果可能的话,我想在不添加额外逻辑的情况下使用它。所以我写了这个问题。谢谢。我建议您仍然将绑定分配给null,并在处理响应之前跟踪生命周期。