728x90
private fun start(){
btn_start.text = "일시정지"
btn_start.setBackgroundColor(getColor(R.color.red))
isRunning = true
//스톱워치를 시작하는 로직
timer = timer(period = 10) {
time++
val milli_second = time % 100
val second = (time % 6000) / 100
val minute = time / 6000
// 밀리초
tv_millisecond.text = if (milli_second < 10) ".0${milli_second}" else ".${milli_second}"
// 초
tv_second.text = if (second < 10) ":0${second}" else ":${second}"
// 분
tv_minute.text = "${minute}"
}
}
- 위와 같이 스톱워치 시작 기능을 개발한 후, 앱을 실행하면 아래와 같은 에러 메시지가 뜬다.
- 'Only the original thread that created a view hierarchy can touch its views'
- 뜻은 '뷰의 계층 구조를 생성한 메인 스레드에서만 그 뷰들에 접근 할 수 있다' 였다.
- 백그라운드 스레드에서 UI 작업을 해주었기 때문에 일어난 에러이다.
- 따라서 텍스트뷰가 UI 스레드에서 실행되도록 아래와 같이 start() 함수를 수정하여야 한다.
private fun start(){
...
runOnUiThread { // ❶
if (isRunning) { // ❷
// 밀리초
tv_millisecond.text = if (milli_second < 10) ".0${milli_second}" else ".${milli_second}"
// 초
tv_second.text = if (second < 10) ":0${second}" else ":${second}"
// 분
tv_minute.text = "${minute}"
}
};
}
출처 : Must Have Joyce의 안드로이드 앱 프로그래밍 with 코틀린 책
728x90
'Kotlin 앱 프로그래밍' 카테고리의 다른 글
(코틀린) 매개변수가 1개인 람다 함수 (0) | 2023.05.21 |
---|---|
코틀린 컬렉션 타입의 데이터 개수만큼 반복문 (0) | 2023.05.20 |
코틀린 for~in 반복문 (0) | 2023.05.20 |
if~else 표현식(expression) (0) | 2023.05.20 |
kotlin에서 리스트와 맵 예제 (0) | 2023.05.20 |