하나의 프로세스는 멀티 스레딩을 지원한다. 다수의 스레드로 동시적 처리가 가능하다. 하나의 프로세스 안에서 동작하는 스레드들은 프로세스의 메모리 고간을 서로 공유할 수 있다.
안드로이드의 스레드는 ① 메인 스레드와 ② 백그라운드 스레드로 나눌 수 있다.
메인스레드는 1개만 존재하고, 백그라운드 스레드는 여러 개가 존재할 수 있다.
안드로이드 시스템은 새로운 앱이 시작하면 새로운 리눅스 프로세스를 시작한다. 메인 액티비티를 비롯한 모든 컴포넌트는 단일 프로세스 및 메인 스레드에서 실행된다.
위 제약사항의 목적은 지속적이고 유연한 사용자 환경을 제공하는 것이다.
백그라운드 스레드에서는 처리 시간을 미리 계산할 수 없는 작업의 처리가 권장된다.
백그라운드 스레드는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현해 생성할 수 있다.
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 구성 요소에 접근하면 안 된다는 제약사항이 있다.
루퍼는 MainActivity가 실행됨과 동시에 for문 하나가 무한루프 돌고 있는 서브 스레드라고 생각하면 된다. 이 무한루프는 대기하고 있다가 자긴의 큐에 쌓인 메시지를 핸들러에 전달한다.
핸들러는 루퍼를 통해 전달되는 메시지를 받아서 처리하는 일종의 명령어 처리기로 사용된다. 앱이 실행되면 자동으로 생성되어 무한루프를 도는 루퍼와 달리 핸들러는 개발자가 직접 생성해서 사용해야 한다.
메시지는 루퍼의 큐에 값을 전달하기 위해 사용되는 클래스로 Message 객체에 미리 정해둔 코드를 입력하고, 큐에 담아두면 루퍼가 핸들러에 전달한다.