Kwaang Tech

[Android] Kotlin으로 안드로이드 스레드(Thread)사용하기 본문

Dev/Study

[Android] Kotlin으로 안드로이드 스레드(Thread)사용하기

콰앙 2023. 10. 30. 23:06

스레드(Thread)

한 개의 프로그램(프로세스)에서는 많은 스레드를 동시에 처리 할 수 있다.
그리고 프로세스의 메모리 또한 공유한다.
프로세스로부터 각 메모리를 할당 받은 스레드는 독립적으로 실행 된다.

안드로이드 역시 1개의 앱(프로그램)에서 여러개의 스레드를 사용할 수 있는데,
예를 들어

음악을 들을 때,
다운로드를 받을 때,
푸쉬 알림 등 이 모두 스레드를 이용한 기능이다.

UI에 접근하기

메인 스레드

엑티비티를 포함해 모든 컴포넌트가 실행되는 오직 1개만 존재하는 스레드

메인 스레드의 제약사항

  • 화면의 UI를 그리는 처리를 담당
  • UI와 상호 작용하고, 이벤트 결과를 사용자에게 보여줌
  • UI 이벤트 등 작업에 일정시간 동안 응압이 없으면 , ANR 팝업 표시 (ANR : 응용 프로그램이 응답하지 않는 것)

즉 사용자가 불편함을 느끼지 않도록 안드로이드는 지속적으로 상호작용을 해야한다. 이러한 제약사항이 없다면, 사용자는 조금이라도 느린 반응에 불편함을 겪을 것이다.

백그라운드 스레드

메인 스레드가 UI 처리 및 사용자와의 상호작용을 한다면, 백그라운드 스레드는 그 나머지를 모두 맡아서 처리한다.
예를 들면, 네트워크 작업 및 파일 다운로드 등 시간이 오래 걸리는 작업을 뜻한다.
안드로이드는 종료 시간을 알 수 없는 작업들에 대해서는 이 백그라운드 스레드에서 처리하길 권장하고 있다.

스레드 실습

Thread

기본적인 스레드 생성 방법

class A : Thread() {
        override fun run() {
            super.run()
            for(i in 1..1000) {
                Log.d("test","second: $i")
            }
        }
}

Runnable Thread

기능상 위의 스레드와의 차이는 없다.
하지만 Thread()를 상속받으면 기타 다른 클래스를 상속받을 수 없다는 단점이 있다. 반면 Runnable을 상속받은 스레드는 다른 클래스도 구현 할 수 있도록 지원하는 모델이다. 그래서 이 Runnable을 상속받은 스레드를 구현하는 일반적이다.

class A : Runnable {
    override fun run() {
        for(i in 1..1000) {
            Log.d("test","second: $i")
        }
    }
}

코틀린에서의 thread()

코틀린에서는 조금 더 간편하게 Thread()를 사용할 수 있다.
thread()안에 파라미터를 start=true로 전달하면 블럭안의 코드를 실행할 수 있다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        thread(start = true) {
            var i = 0
            while (i < 10) {
                i += 1
                Log.d("test", "first: $i")
            }
        }
    }
}

runOnUiThread로 UI에 접근하기

간단하게 Thread.sleep() 함수를 사용해서 초단위로 TextView에 반영
runOnUiThread를 사용해서 간단하게 UI에 접근이 가능

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        thread(start = true) {
            var i = 0
            while (i < 10) {
                i += 1

                runOnUiThread{
                    textView.text = "test : $i"
                }
                Thread.sleep(1000)
            }
        }
    }
}

사실 runOnUiThread는 간단한 방법이다.
스레드의 결과를 UI에 접근해서 조작하는 방법은 또 다른 것이 있는데,
그건 Looper와 Handler이다.
하지만 이건 다음시간에~

반응형