0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Android:LiveData observeメソッドの注意事項!

Last updated at Posted at 2025-02-08

はじめに

LiveDataは非常に便利だが、、設計上の仕様を把握していないとアプリがクラッシュしたり、意図していない処理が何度も走ってしまうことがある。
この辺りの注意事項についてまとめてみる。

注意事項

LiveDataのobserveメソッドを呼び出した際、LiveDataにイベントが保持されていればそのイベントを即座に処理してしまいます。
これは LiveData の設計上の仕様です。

LiveData は最新の値をキャッシュしており、Observer への通知は以下の状況で行われます:

  1. Active な状態(Lifecycle が STARTED または RESUMED)で LiveData の値が更新された場合
  2. Inactive から Active になった場合

この挙動により、一度だけ実行したい処理(例えば、Fragmentの遷移時)に不都合が生じる可能性があります。例えば、あるFragmentに戻った際に、以前にセットされた値が再度処理されてしまう問題が起こりうるのです。

この問題に対処するためには、いくつかの方法があります:

  1. SingleLiveEvent や Event クラスを使用して、一度だけ処理されるイベントを実装する。
  2. StateFlow を使用して、初期値を明示的に設定し、null 対応の問題を回避する。
  3. observe メソッドの呼び出しタイミングを適切に管理する。

LiveData の使用には注意が必要ですが、適切に使用すれば UI とデータの状態を一致させ、メモリリークを防ぎ、ライフサイクルに応じた適切な処理を行うことができます。

結論_解決策1:SingleLiveEvent

イベントを流した時に一度だけobserveするクラスを作成して使うのが良いかと。
この辺りは以下記事が超詳しく記載されている
 https://qiita.com/yogita109/items/c2fae2ff7aafd671ddad

結論_解決策2:observe メソッドの呼び出しタイミング

・Activityの場合:onCreateのタイミングでコールする
・Fragmentの場合:onViewCreatedのタイミングでコールする
 →onResumeとかonCreateViewとかのイベントだとコールされるタイミングが増えるため、検討が必要になる。
 検討は必要だが、公式にも記載されている通り予期せぬ動作になる(処理が二重に走ったりね)可能性があるため、素直に公式に従った方が良いと思われる。

この辺りはAndroid公式を見るべし
 https://developer.android.com/topic/libraries/architecture/livedata?hl=ja#observe_livedata_objects

以上

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?