在数据绑定上调用 setLifecycleOwner 时,我应该传递从 getViewLifecycleOwner 返回的 Fragment 实例还是所有者
Should I pass Fragment instance or owner returned from getViewLifecycleOwner when calling setLifecycleOwner on data binding
哪种方法是正确的:
将 Fragment
实例作为 lifecycleOwner
:
传递
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val binding = FragmentEventSettingsBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this
return binding.root
}
传递 Fragment
的 viewLifecycleOwner
:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val binding = FragmentEventSettingsBinding.inflate(inflater, container, false)
binding.lifecycleOwner = viewLifecycleOwner
return binding.root
}
推荐的解决方案是通过支持库 28.0.0 和 AndroidX 1.0.0 中添加的 getViewLifecycleOwner() 或 getViewLifecycleOwnerLiveData() 使用片段的视图生命周期,这样每次片段的视图被销毁时,LiveData 都会删除观察者
第一种方法正确
第二个最有效,但它可能会隐式导致您的应用程序崩溃并且会消耗更多资源。因为 Fragment
实现了 LifecycleOwner
,当你可以使用 this
时,你的程序就可以编译了。
然而,当使用this
时,观察者持续时间更长。例如,当 onDestroyView()
被执行而 onDestroy()
没有执行时,您的 RecyclerView
被销毁,并且您的 LiveData 被更改,这将导致您的应用程序尝试填充空值 RecyclerView
,您的应用程序将崩溃。
在 Android Studio 中,如果您使用 this
,它会建议您使用 viewLifecycleOwner
。
哪种方法是正确的:
将
传递Fragment
实例作为lifecycleOwner
:override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val binding = FragmentEventSettingsBinding.inflate(inflater, container, false) binding.lifecycleOwner = this return binding.root }
传递
Fragment
的viewLifecycleOwner
:override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val binding = FragmentEventSettingsBinding.inflate(inflater, container, false) binding.lifecycleOwner = viewLifecycleOwner return binding.root }
推荐的解决方案是通过支持库 28.0.0 和 AndroidX 1.0.0 中添加的 getViewLifecycleOwner() 或 getViewLifecycleOwnerLiveData() 使用片段的视图生命周期,这样每次片段的视图被销毁时,LiveData 都会删除观察者
第一种方法正确
第二个最有效,但它可能会隐式导致您的应用程序崩溃并且会消耗更多资源。因为 Fragment
实现了 LifecycleOwner
,当你可以使用 this
时,你的程序就可以编译了。
然而,当使用this
时,观察者持续时间更长。例如,当 onDestroyView()
被执行而 onDestroy()
没有执行时,您的 RecyclerView
被销毁,并且您的 LiveData 被更改,这将导致您的应用程序尝试填充空值 RecyclerView
,您的应用程序将崩溃。
在 Android Studio 中,如果您使用 this
,它会建议您使用 viewLifecycleOwner
。