はじめに
LiveDataは非常に便利だが、、設計上の仕様を把握していないとアプリがクラッシュしたり、意図していない処理が何度も走ってしまうことがある。
この辺りの注意事項についてまとめてみる。
注意事項
LiveDataのobserveメソッドを呼び出した際、LiveDataにイベントが保持されていればそのイベントを即座に処理してしまいます。
これは LiveData の設計上の仕様です。
LiveData は最新の値をキャッシュしており、Observer への通知は以下の状況で行われます:
- Active な状態(Lifecycle が STARTED または RESUMED)で LiveData の値が更新された場合
- Inactive から Active になった場合
この挙動により、一度だけ実行したい処理(例えば、Fragmentの遷移時)に不都合が生じる可能性があります。例えば、あるFragmentに戻った際に、以前にセットされた値が再度処理されてしまう問題が起こりうるのです。
この問題に対処するためには、いくつかの方法があります:
- SingleLiveEvent や Event クラスを使用して、一度だけ処理されるイベントを実装する。
- StateFlow を使用して、初期値を明示的に設定し、null 対応の問題を回避する。
- 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
以上