이번 태스크는 이전 태스크와 매우 밀접하게 연관되어 있습니다. 이전 태스크에서 우리는 score과 word를 LiveData로 감싸는 작업을 하였습니다. 이번 태스크에서는 이런 LiveData에 Observer를 붙히는 작업을 해 볼 것 입니다.
1. GameFragment의 onCreateView()안에서 viewModel.score에 대한 LiveData에 Observer를 붙혀 봅시다. viewModel을 초기화 하는 코드 다음에 observe()를 사용해서 LiveData에 observer를 붙혀야 합니다. 람다 표현식을 사용하여 코드를 간단히 구현해 보세요.
viewModel.score.observe(this, Observer { newScore ->
})
Observer를 사용하려면 androidx.lifecycle.Observer를 import해야 합니다.
2. 위에서 생성한 observer는 라이브데이터의 변경이 이뤄졌을 때, 이벤트를 받습니다. viewModel.score의 observer안에 TextView의 score를 업데이트 하는 코드를 넣어 주세요.
/** Setting up LiveData observation relationship **/
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
Observer는 이렇게 구현되어 있으며, 위의 코드는 onChanged()가 호출 되었을 때, textview를 업데이트 하도록 구현 한 것 입니다.
public interface Observer<T> {
/**
* Called when the data is changed.
* @param t The new data
*/
void onChanged(T t);
}
3. 이제 word LiveData에도 Observer를 붙혀 봅시다. score에 Observer를 붙힌 것과 동일한 방식으로 구현하면 됩니다.
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
이제 score와 word 데이터가 변경 되었을 때, 화면에 나타나는 score, word 또한 자동으로 변경이 됩니다.
4. GameFragment에서 updateWordText()와 updateScoreText()를 제거해 줍니다. LiveData가 변경되었을 때 자동으로 뷰가 업데이트 되므로 이 두개의 함수는 이제 더이상 필요 없습니다.
원래는 onSkip()/onCorrect() 호출 시 ViewModel이 가지고 있는 데이터에 변경이 발생하여 이 뒤에 View에 업데이트를 적용하는 함수인 updateWordText()와 updateScoreText()를 호출 해 준 것이지만, 이제 LiveData의 변경을 감지하여 Observer의 onChanged()에서 뷰의 변경을 처리 해 주기 때문에 위의 두개의 함수를 이제 제거 해 줍니다.
5. 앱을 한번 실행 해 보세요. 앱은 이전과 똑같이 동작 하지만, 해당 앱은 LiveData와 Observer를 사용하여 구현된 앱 입니다.