POST

[코틀린]안드로이드 runOnUiThread사용 1초마다 카운트하기

 

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초멈춤 -> 반복