[Android] Kotlin으로 안드로이드 스레드(Thread)사용하기
스레드(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이다.
하지만 이건 다음시간에~