Android/Study

[Android] runOnUiThread()에 대해서 공부해보자

Tenacity_Dev 2024. 6. 1. 17:14
728x90

Android Thread에 대해서 알아보자.

일반적으로 Thread는 메인 스레드와 백그라운드 스레드로 나누어진다.

 

메인 스레드

앱이 처음 시작되면 시스템이 스레드 하나를 생성하는데 이를 메인 스레드라고 한다. 메인 스레드의 역할은 크게 두 가지로 액티비티의 모든 명 주기 관련 콜백을 실행을 담당하거나, 버튼, 에디트텍스트와 같은 UI 위젯을 사용한 용자의 이벤트와 UI드로잉 이벤트를 담당한다. 그렇기 때문에 UI 스레드라과 불린다.

 

백그라운드 스레드

작업량이 큰 연산이나, 네트워크 통신, 데이터베이스 쿼리 등은 처리에 긴 시간이 걸린다. 이 모든 작업을 메인 스레드의 큐에 넣고 작업하면 한 작업이 처리가 완료될 때까지 다른 작업을 처리하지 못하는 현상이 발생한다. 이러한 현상을 피하기 위해서 백그라운드 스레드를 이용하여 처리한다.

 

runOnUiThread()

public final void runOnUiTread(Runnable action) {
	if(Tread.currentTread() != mUiThread){ // 메인 스레드가 아니면 액션을 메인 스레드에 전달
		mHadler.post(action);
	} else {  // 메인 스레드이면 스레드 생성
		action.run()
	}
 }

안드로이드 runOnUiThread Activity 클래스에서 제공되는 메소드이다. Android developer에서는 Runnable 객체를 메인 스레드에서 실행하도록 만드는 메소드로 현재 스레드가 메인 스레드이면 Runnable 객체의 run() 메소드를 직접 실행 을 하고 아니라면 Handler에게 post() 메소드를 통하여 메인 스레드로 이벤트 큐를 발송한다.

 

class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Other Thread
        val mThread = Thread { // 익명 객체 구현
            // 여기서 UI 작업을 수행하면 Exception 발생
            runOnUiThread {
                // UI 작업 가능.
                // UI 스레드가 아니라면 내부적으로 handler.post() 호출
            }
        }
        mThread.start()
    }
}

 

 

  • 백그라운 스레드 → UI 스레드 → UI 자원
  • 백그라운드에서 UI 자원을 사용하려면 메인 스레드에 UI 자원 사용 메세지를 전달해야 한다.
  • 아래는 timer를 사용한 예시이다.
    timer = timer(initialDelay = 0, period = 100) {
                currentDeciSecond += 1

                val minutes = currentDeciSecond.div(10) / 60
                val seconds = currentDeciSecond.div(10) % 60
                val deciSeconds = currentDeciSecond % 10

                runOnUiThread {
                    binding.timeTextView.text = String.format("%02d:%02d", minutes, seconds)
                    binding.tickTextView.text = deciSeconds.toString()

                    binding.countdownGroup.isVisible = false
                }
            }
  • 뷰에 접근하기 위해서는 메인 스레드(UI 스레드)인 runOnUiThread()를 사용해야 한다.

 

참고

https://cocococo.tistory.com/entry/Kotlin-%EC%8A%A4%EB%A0%88%EB%93%9CThread%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-runOnUiTread-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95

 

[Kotlin] 스레드(Thread)의 개념 및 runOnUiTread 사용 방법

Thread Thread는 메인 스레드와 백그라운드 스레드로 나누어진다. UI 변경은 메인 스레드(UI 변경 스레드)에서만 가능하고, 백그라운드 스레드는 네트워크 작업, 데이터베이스 작업, 계산량이 많은

cocococo.tistory.com

 

728x90