之前在Fragment中使用model.observe(getViewLifecycleOwner())這段代碼,突然對(duì)這段getViewLifecycleOwner() 代碼的生命周期感到好奇摸航,因?yàn)锳ctivity是使用自身的生命周期,而Fragment也是可以使用自身生命周期的舅桩,但是如果Fragment使用model.observe(this)酱虎,就會(huì)報(bào)以下警告:
這個(gè)警告的意思是我們需要使用getViewLifecycleOwner()。
getViewLifecycleOwner()這個(gè)意思是view的生命周期擂涛,也就是說读串,在Fragment中,this跟getViewLifecycleOwner()的分別區(qū)別如下:
this - Fragment的自身生命周期
getViewLifecycleOwner() - Fragment中的view的生命周期
那么為什么要使用getViewLifecycleOwner()呢撒妈?
我們先復(fù)習(xí)下Fragment的生命周期
打開Fragment:
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
點(diǎn)擊Home鍵恢暖,F(xiàn)ragment進(jìn)入暫停生命周期
onPause
onStop
然后重新打開該App恢復(fù)該Fragment
onStart
onResume
那我們點(diǎn)擊Back退出該Fragment的生命周期
onPause
onStop
onDestroyView
onDestroy
onDetach
上面四種生命周期是比較常見場(chǎng)景,那么從一個(gè)Fragment打開到銷毀狰右,會(huì)經(jīng)歷以下生命周期
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
onPause
onStop
onDestroyView
onDestroy
onDetach
我們主要看重點(diǎn)這四個(gè)
onCreate
onCreateView
onDestroyView
onDestroy
兩者區(qū)別簡(jiǎn)而言之:
getViewLifecycleOwner()綁定fragment 的onCreateView()到 onDestroyView()這個(gè)范圍的生命周期
this 綁定 fragment 的整個(gè)生命周期onCreate()到onDestroy()這個(gè)范圍的生命周期杰捂,生命周期范圍會(huì)更長(zhǎng)
那么為什么要使用getViewLifecycleOwner()呢?
如果使用this棋蚌,當(dāng)使用viewModel獲得數(shù)據(jù)時(shí)嫁佳,此時(shí)如果onDestroyView()被調(diào)用已經(jīng)銷毀掉了View挨队,但 onDestroy()未被調(diào)用,則會(huì)將繼續(xù)觀察 LiveData蒿往,然后填充數(shù)據(jù)到不存在的 RecyclerView 時(shí)會(huì)崩潰盛垦。但是如果改成使用 viewLifecycleOwner,則可以避免問題