Transformations.map 메소드는 원본 LiveData의 데이터를 수정하고 결과 LiveData 객체를 리턴하는 방법을 제공한다.
이 transformations은 리턴된 옵저버가 LiveData 객체를 observe하고 있지 않으면 계산되지 않는다.
- 주의사항 : Transformations.map 메소드에서 실행되는 람다식은 메인 스레드에서 실행되기 때문에
오래 실행되는 task를 포함하면 안된다.
이번에는 경과 시간의 LiveData 객체를 "MM:SS" 형식의 새 문자열 LiveData 객체 형태로 만든다.
game_fragment.xml 레이아웃 파일은 이미 타이머 텍스트뷰를 가지고 있다.
지금까지 텍스트뷰에 보여줄 텍스트가 없었으므로 타이머 텍스트가 보이지 않았다.
1. GameViewModel에서 currentTime을 초기화한 뒤, currentTimeString이라는 LiveData 객체를 만든다.
이 객체는 currentTime의 형식화된 문자열 객체이다.
2. Transformations.map 메소드를 사용해 currentTimeString을 정의한다. 람다함수에 currentTime을 넘겨준다.
DateUtils.formatElapsedTime 유틸리티 메소드를 사용해 람다함수로 구현할 수 있다.
이 메소드는 초 단위 시간을 long 타입으로 가지고 문자열을 "MM:SS" 형식으로 지정한다.
// The String version of the current time
val currentTimeString = Transformations.map(currentTime) { time ->
DateUtils.formatElapsedTime(time)
}
3. xml의 타이머 텍스트뷰에 text 속성을 gameViewModel의 currentTimeString으로 바인드한다.
<TextView
android:id="@+id/timer_text"
...
android:text="@{gameViewModel.currentTimeString}"
... />
이제 앱을 실행하면 타이머 텍스트가 1초마다 업데이트되고, 이제 게임은 타이머가 종료될 때 종료된다.
'Android' 카테고리의 다른 글
Android Notification channel 설정이 적용안되는 경우 (0) | 2023.06.09 |
---|---|
Codelab으로 LiveData transform해보기 - 3. 정리(完) (0) | 2023.05.23 |
Codelab으로 LiveData transform해보기 - 1. Add a Timer (0) | 2023.05.19 |
Codelab으로 DataBinding 알아보기 - 4. 정리(完) (1) | 2023.05.17 |
Codelab으로 DataBinding 알아보기 - 3. Add LiveData to data binding (0) | 2023.05.14 |