Android Kotlin基礎講座 05.2: LiveDataとLiveData observers

タスク:LiveDataオブジェクトにオブザーバーを取り付ける

このタスクはscore変数とword変数をLiveDataオブジェクトに変換したタスクに強く関連しています。このタスクではObserverオブジェクトをそれらのLiveDataオブジェクトに取り付けます。フラグメントビュー(viewLifecycleOwner)をLifecycleOwnerとして使います。

viewLifecycleOwnerを使う理由
フラグメントのビューはユーザーがそのフラグメントから離れた際に破棄されます。たとえそのフラグメント自身が破棄されない場合であってもです。これによって本来二つのライフサイクルが生成されます。フラグメントのライフサイクルとフラグメントのビューのライフサイクルです。フラグメントのビューのライフサイクルではなく、フラグメントのライフサイクルを使うと、フラグメントのビューを更新した際に細かいバグが発生することがあります。従って、フラグメントのビューに影響を与えるオブザーバーをセットアップする際は、以下のようにします。

1. onCreateView()の中でオブザーバーをセットアップする。
2. オブザーバーにviewLifecycleOwnerを渡す。

  1. GameFragment中のonCreateView()メソッド中で、現在の得点用のLiveDataであるviewModel.scoreにObserverオブジェクトを取り付けてください。observe()メソッドを使い、viewModelの初期化の後にコードを追加してください。

    コードを簡略化するためにラムダ式を使ってください。(ラムダ式とは宣言されていない匿名関数で、即座に渡されることができるものです)
viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->
})

Observerへの参照を解決してください。Observerをクリックし、Alt+Enter(Macの場合Option+Enter)を押し、androidx.lifecycle.Observerをインポートすることで解決できます。

  1. 今作成したオブザーバーは監視されるLiveDataオブジェクトに保持されているデータに変更があった場合にイベントを受け取ります。オブザーバーの中で、得点用のTextViewを新しい得点に更新するようにしてください。
/** Setting up LiveData observation relationship **/
viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Observerオブジェクトを現在の得点用のLiveDataオブジェクトにも取り付けてください。現在の得点用にやったときと同様に行います。
/** Setting up LiveData observation relationship **/
viewModel.word.observe(viewLifecycleOwner, Observer { newWord ->
   binding.wordText.text = newWord
})

これでscoreとwordの値が変わった際に、画面に表示されるscoreとwordも自動で更新されます。

  1. GameFragment中のupdateWordText()メソッドとupdateScoreText()メソッド、および全てのそれらに対する呼び出しを削除してください。テキストビューはLiveDataオブザーバーメソッドによって自動で更新されるのでもう必要ないためです。
  2. アプリを起動してください。以前と同じように動作することを確認してください。