在数据绑定上调用 setLifecycleOwner 时,我应该传递从 getViewLifecycleOwner 返回的 Fragment 实例还是所有者

Should I pass Fragment instance or owner returned from getViewLifecycleOwner when calling setLifecycleOwner on data binding

哪种方法是正确的:

  1. 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
    }
    
  2. 传递 FragmentviewLifecycleOwner:

    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 都会删除观察者

参考:5 common mistakes when using Architecture Components

第一种方法正确

第二个最有效,但它可能会隐式导致您的应用程序崩溃并且会消耗更多资源。因为 Fragment 实现了 LifecycleOwner,当你可以使用 this 时,你的程序就可以编译了。

然而,当使用this时,观察者持续时间更长。例如,当 onDestroyView() 被执行而 onDestroy() 没有执行时,您的 RecyclerView 被销毁,并且您的 LiveData 被更改,这将导致您的应用程序尝试填充空值 RecyclerView ,您的应用程序将崩溃。

在 Android Studio 中,如果您使用 this,它会建议您使用 viewLifecycleOwner