Fragment生命周期 - 图文、详细、白话解析

之前在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,则可以避免问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容