Posted at

FragmentでLiveData#observeを使うときの第一引数(Owner)には`viewLifecycleOwner`を使う

タイトルにすべて書いてしまいました。少し解説します。

通常、LiveData#observeを使うとき、第一引数にthisを入れがちです。


class MainFragment : Fragment() {
...

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.livedata.observe(this, Observer {
update(it)
})
}

...
}

Activityではこれで良いですが、Fragmentで使うときにthisを入れるのは間違いです。動くには動きますが、画面を閉じても購読が停止されず、画面を開くたびに購読が積み重なっていきます。

すると、イベントが起きるたびに複数回Observerが呼び出されようになり、意図せぬ動作の原因になったり、パフォーマンスの低下にも繋がります。

FragmentでLiveData#observeを使うときはviewLifecycleOwnerを使いましょう。


class MainFragment : Fragment() {
...

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.livedata.observe(viewLifecycleOwner, Observer {
update(it)
})
}
}

詳しくは以下の記事がとても参考になります。

5 common mistakes when using Architecture Components