タイトルにすべて書いてしまいました。少し解説します。
通常、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)
})
}
}
詳しくは以下の記事がとても参考になります。