하나의 프로세스는 멀티 스레딩을 지원!
다음 그림을 보면 이해가 빠를것이다.
스레드의 종류
① 메인 스레드
② 백그라운드 스레드
[메인스레드는 1개만 존재, 백그라운드 스레드는 여러 개가 존재 가능]
메인 액티비티를 비롯한 모든 컴포넌트는 단일 프로세스 및 메인 스레드에서 실행된다.
메인 스레드 특징 및 제약사항
① 화면의 UI를 그리는 처리를 담당한다.
② 안드로이드 UI 툴깃의 구성 요소와 상호작용하고, UI 이벤트를 사용자에게 응답하는 스레드이다.
③ UI 이벤트 및 작업에 대해 수 초 내에 응답하지 않으면 안드로이드 시스템은 ANR(응용 프로그램이 응답하지 않음) 팝업창을 표시하다. 시간이 오래 걸리는 코드는 새로운 스레드를 생성해서 처리해야한다.
백그라운드 스레드에서는 미리 계산 할 수 없는 작업의 처리가 권장됨.
이때, 두가지 옵션이 있는데 하나는 Thread객체, 하나는 Runnable 인터페이스로 구현이 가능하다.
class WorkerThread : Thread() {
override fun run() {
var i = 0
while (i < 10) {
i += 1
Log.i("WorkerThread","$i")
}
}
Thread {
var i = 0
while (i < 10) {
i += 1
Log.i("WorkerThread","$i")
}
}.start()
만약 UI를 멀티 스레드로 변경해버린다면,,?
원하는 UI로 그려지지 않을 확률도 높고, 여러 이상현상이 발생할 것이다.
따라서 안드로이드에서는 UI를 오직 Main(UI) 스레드만 건드릴 수 있다.
메인 스레드를 정지?
절대 정지 시킬 수 없다!!(하면 안된다!)
왜냐하면, 정지 시키거나 종료 시키면 더 이상 사용자의 input을 받을 수 없기 때문이다.
오래 걸리는 작업은 작업 스레드에서, UI 업데이트만 메인 스레드에서 작업하자!!