内容
LiveDataやFlowを使って値の変更をwatchするようになり、Fragmentのライフサイクルに対してどのタイミングで発動するのかが気になったので調べてみた。
結果
イベント | タイプ |
---|---|
onCreate | Fragment |
launchWhenCreated | Flow |
onCreateView | Fragment |
onViewCreated | Fragment |
onViewStateRestored | Fragment |
onStart | Fragment |
lifecycleOwner | LiveData |
launchWhenStarted | Flow |
viewLifecycleOwner | LiveData |
onResume | Fragment |
launchWhenResumed | Flow |
onStop | Fragment |
onSaveInstanceState | Fragment |
onDestroyView | Fragment |
onStart
以降に viewModelの値が変化した場合、コードの記述順に関わらず同じ順番でイベントが呼ばれているviewLifecycleOwner
とlaunchWhenStarted
は後から値がセットされたか、最初から値があったかで順序が異なる。
とはいえ同じ値を同時にwatchすることはないだろうから気にしなくても良さそう。
検証コード
コードは大体以下のような感じ。super()は省略。viewModel.hogeにはあらかじめ値がセットされているものと仮定する。
override fun onCreate() { viewModel.hoge.observe(this){ Log.d(TAG, "lifecycleOwner") } lifecycleScope.launchWhenCreated { viewModel.hoge.asFlow().collectLatest { Log.d(TAG, "launchWhenCreated") } } lifecycleScope.launchWhenStarted { viewModel.hoge.asFlow().collectLatest { Log.d(TAG, "launchWhenStarted") } } lifecycleScope.launchWhenResumed { viewModel.hoge.asFlow().collectLatest { Log.d(TAG, "launchWhenResumed") } } Log.d(TAG, "onCreate") } override fun onCreateView() { viewModel.hoge.observe(viewLifecycleOwner) { Log.d(TAG, "viewLifecycleOwner") } Log.d(TAG, "onCreateView") } override fun onViewStateRestored() { Log.d(TAG, "onViewStateRestored") } override fun onStart() { Log.d(TAG, "onStart") } override fun onResume() { Log.d(TAG, "onResume") } override fun onStop() { Log.d(TAG, "onStop") } override fun onSaveInstanceState() { Log.d(TAG, "onSaveInstanceState") } override fun onDestroyView() { Log.d(TAG, "onDestroyView") }
感想
概ね予想通り。 Fragmentのライフサイクルの後にFlowイベントが発火するのでその辺は意識しておいた方がいいかもしれない。 LiveDataとFlowに関してはViewModelの値が変更された場合のライフサイクルを含めた挙動などについても今後確認をしておきたい。