之前在Fragment中使用model.observe(getViewLifecycleOwner())这段代码,突然对这段getViewLifecycleOwner() 代码的生命周期感到好奇,因为Activity是使用自身的生命周期,而Fragment也是可以使用自身生命周期的,但是如果Fragment使用model.observe(this),就会报以下警告:
这个警告的意思是我们需要使用getViewLifecycleOwner()。
getViewLifecycleOwner()这个意思是view的生命周期,也就是说,在Fragment中,this跟getViewLifecycleOwner()的分别区别如下:
this - Fragment的自身生命周期
getViewLifecycleOwner() - Fragment中的view的生命周期
那么为什么要使用getViewLifecycleOwner()呢?
我们先复习下Fragment的生命周期
打开Fragment:
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
点击Home键,Fragment进入暂停生命周期
onPause
onStop
然后重新打开该App恢复该Fragment
onStart
onResume
那我们点击Back退出该Fragment的生命周期
onPause
onStop
onDestroyView
onDestroy
onDetach
上面四种生命周期是比较常见场景,那么从一个Fragment打开到销毁,会经历以下生命周期
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
onPause
onStop
onDestroyView
onDestroy
onDetach
我们主要看重点这四个
onCreate
onCreateView
onDestroyView
onDestroy
两者区别简而言之:
getViewLifecycleOwner()绑定fragment 的onCreateView()到 onDestroyView()这个范围的生命周期
this 绑定 fragment 的整个生命周期onCreate()到onDestroy()这个范围的生命周期,生命周期范围会更长
那么为什么要使用getViewLifecycleOwner()呢?
如果使用this,当使用viewModel获得数据时,此时如果onDestroyView()被调用已经销毁掉了View,但 onDestroy()未被调用,则会将继续观察 LiveData,然后填充数据到不存在的 RecyclerView 时会崩溃。但是如果改成使用 viewLifecycleOwner,则可以避免问题