30
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

通常、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

30
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?