10초동안 1초마다 카운트하여 textView의 text속성에 출력하는 아래의 프로그램을 만들며 runOnUiThread의 사용법을 설명 하겠습니다.

코드를 잠깐 정지 시키기 위해서는 Thread.sleep() 함수를 호출해야 합니다.
사용예 - Thread.sleep(1000) // 1초를 멈춘다
하지만 메인스레드에서 해당 함수를 호출하면 화면을 그려주는 메인스레드가 함께 멈추기 때문에 화면에는 아무것도 보이지 않습니다. 이 때문에 해당함수는 서브스레드를 생성하여 사용해야하는데 thread(start=true)함수를 호출하여 사용합니다.
사용예 - thread(start=true) { Thread.sleep(1000) } // 서브스레드를 생성하여 서브스레드를 1초간 멈춘다
여기서 textView의 text속성을 변경하려면 메인스레드에서 textView를 그려주어야하는데
나쁜 사용 예
thread(start=true) { // 서브스레드 생성
Thread.sleep(1000) // 1초간 서브스레드를 멈춤
binding.textview.text = "카운트" } // textView의 text속성 변경
위 처럼 사용을 하게 되면 1초뒤 앱이 죽어 버립니다.
그 이유는 ui와 관련된 것들은 메인스레드에서 작동 되어야하기 때문입니다.
여기서 runOnUiThread를 사용합니다.
runOnUiThread는 코드 블록 안에서 코드를실행시 메인스레드에서 실행 할 수 있게합니다.
사용 예
thread(start=true) {
Thread.sleep(1000)
runOnUiThread {
binding.textview.text = "카운트" } }
이제 앱을 실행 하여도 죽지않고 1초뒤 text의 속성이 변경됩니다.
이제 마지막 반복하는 코드를 추가합니다.
for문을 이용하여 만들어 봅니다. for문은 서브 스레드 생성후 실행 할 수 있도록합니다.
thread(start=true) {
for(counter in 1..10) {
Thread.sleep(1000)
runOnUiThread {
binding.textView.text = "${counter}"
} } }

코드의 흐름은 아래와 같습니다.
서브 스레드 생성 -> for문 시작 -> 1초간 멈춤 -> 메인스레드 접근 -> text속성 변경 -> 1초멈춤 -> 반복
'Android' 카테고리의 다른 글
[안드로이드] 코틀린 프레그먼트 연습 FragmentTest - ViewBinding (0) | 2021.11.29 |
---|---|
[안드로이드] 코틀린 viewBinding - 코틀린 익스텐션 대체 (0) | 2021.11.25 |
[코틀린] 안드로이드 코틀린 XML 소스 - string/color/dimens (0) | 2021.10.17 |
[코틀린] 안드로이드 null허용 - Null safety (0) | 2021.10.14 |
[코틀린] 안드로이드 코틀린 반복문 제어하기 - break/continue (0) | 2021.10.07 |