저번 단계에서는 score와 word의 데이터를 LiveData 객체로 바꿔줬다.
이번 단계에서는 Observer 객체를 작업한 LiveData 객체에 붙일 것이다.
우리는 fragment의 뷰(viewLifecycleOwner)를 LifecycleOwner로써 사용할 것이다.
왜 viewLifecycleOwner를 사용할까?
프래그먼트의 뷰는 프래그먼트 자체가 부서지지 않더라도 사용자가 다른 곳으로 이동하면 부서진다.
이것은 필연적으로 프래그먼트의 lifecycle과 프래그먼트 뷰의 lifecycle 두 lifecycle을 만든다.
프래그먼트의 뷰 대신 프래그먼트의 lifecycle을 참조하면 뷰를 업데이트할 때 사소한 버그가 생길 수 있다.
그래서, 프래그먼트의 뷰에 영향을 미치는 observer를 설정할 때
onCreateView() 메소드 안에서 observer를 설정해야 하고 viewLifecycleOwner를 observer에게 넘겨주어야 한다.
1. GameFragment의 onCreateView() 메소드 안에서 Observer객체를 현재 점수를 나타내는 LiveData 객체에 붙인다.
observe() 메소드를 사용하고, viewModel 초기화 이후 코드를 넣어준다.
viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->
})
Observer에 대한 참조를 해결하기 위해서는 androidx.lifecycle.Observer를 import 해주어야 한다.
2. 만든 observer는 LiveData 객체가 갖고 있는 데이터의 변경이 있을 때 이벤트를 받는다.
observer 안에 score의 text를 새로운 점수로 업데이트한다.
/** Setting up LiveData observation relationship **/
viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
3. Observer객체를 현재 word LiveData 객체에 붙인다.
위와 동일한 작업이다.
/** Setting up LiveData observation relationship **/
viewModel.word.observe(viewLifecycleOwner, Observer { newWord ->
binding.wordText.text = newWord
})
이제 score와 word의 값이 바뀌면 보여지는 score나 word는 자동으로 업데이트한다.
4. GameFragment에서 updateWordText()와 updateScoreText() 메소드, 모든 참조까지 지운다.
우리는 이제 LiveData observer 메소드가 자동으로 textview를 업데이트하기 때문에 필요가 없다.
'Android' 카테고리의 다른 글
기존 프로젝트의 Java to Kotlin 전환 시 주의점 (0) | 2023.02.26 |
---|---|
Codelab으로 LiveData 알아보기 - 3. Encapsulate the LiveData (0) | 2023.01.26 |
Codelab으로 LiveData 알아보기 - 1. Add LiveData to the GameViewModel (0) | 2023.01.17 |
Codelab으로 LiveData 알아보기 - 과정 소개 (2) | 2023.01.15 |
Codelab으로 ViewModel 알아보기 - 4. Use a ViewModelFactory(完) (0) | 2023.01.13 |