Kotlin 앱 프로그래밍

(Kotlin)스톱워치 기능 구현

쿠카이든 2022. 4. 23. 22:43
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