Android 如果我在片段中使用ViewBinding,我会在onDestoryView()之后使用NPE吗?
我试图在片段中使用ViewBinding 首先,谷歌表示如下: 注意:片段比其视图寿命长。确保清除片段的onDestroyView()方法中对绑定类实例的所有引用。[] 因此,我编写了如下代码: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() =
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,并在处理响应之前跟踪生命周期。