[Android] Thread, Handler, Looper에 대해 알아보자.

MinGyun_06·2023년 5월 21일

android

목록 보기
7/7
post-thumbnail

글을 시작하기 전에

프로세스(Process)란?

간단히 말하자면 작업의 단위이다. 모바일에서는 한 어플리케이션 인스턴스라고 할 수 있다.

1. 스레드

스레드란?

프로세스(Process) 내에서 순차적으로 실행되는 실행흐름의 최소 단위이자 동시 작업을 위한 하나의 단위이다.

위의 개념을 스레드(thread)라고 부르며, 하나의 프로세스 내에서 두 개 이상의 스레드가 동작하도록 프로그래밍 하는 것을 멀티스레드 프로그래밍(Multi-Thread Programming)이라고 한다.

메인 스레드(Main Thread)란

프로세스가 시작될 때 동시에 실행되는, 앱의 기본 실행을 담당하는 스레드. 즉 프로세스의 최초 스레드이다.

안드로이드 에서는 AndroidManifest.xml에서 앱에 포함된 액티비티 중 하나를 런처로 지정함으로써, 앱(프로세스)의 시작점을 지정해줄 수 있다.

작업자 스레드(Worker Thread)란

메인 스레드 하나에서 서버 통신이나 데이터베이스 쿼리 등의 긴 작업을 수행할 경우 전체 UI가 차단될 위험이 있다. 스레드가 차단되면 UI의 모든 이벤트가 차단되기 때문에 사용자에게 어플리케이션이 중단된 것처럼 보인다.

위와 같은 오류를 발생시키지 않게 하기 위해서 스레드를 추가할 수 있다. 이 추가된 스레드를 작업자 스레드(Worker Thread)라고 한다.

Looper

각각의 쓰레드는 오직 하나의 Looper를 가지며, Looper는 오직 하나의 쓰레드를 담당한다. 안드로이드에서는 기본적으로 MainActivity가 실행됨과 동시에 자동으로 메인쓰레드의 Looper가 실행된다.

Looper 내부에는 MessageQueue 라는 것이 존재하는데, 여기에는 해당 쓰레드가 처리해야 할 동작들이 "Message" 라는 형태로 하나씩 쌓이게 된다. (큐 형식이기 때문에 FIFO 방식)

Looper는 MessageQueue(메세지큐)에 들어오는 메세지들을 꺼내어 적절한 Handler로 전달하는 역할을 한다.

위에서 말하는 메세지란?

메세지는 '하나의 작은 작업 단위'라고 생각하면 편하다.
Message 객체는 두가지 종류로 이루어지는데, Runnable 객체로 이루어질 수도 있고, 일반적인 경우 Message 객체로 이루어져 있다.
Runnable 객체가 담겨져있으면 Handler에 메세지를 전달하지 않고 run()을 수행하여 해당 Runnable 작업을 바로 시작한다.
그렇지 않을 경우에는 handleMessage()를 수행하여 처리한다.

Handler

Handler 는 명칭으로 보면 뭔가를 다루는 녀석 같은데, 특정 메세지를 Looper의 MessageQueue에 넣거나, Looper가 MessageQueue에서 특정 메세지를 꺼내어 전달하면 이를 처리하는 중간 다리 역할 기능을 한다.

전반적인 동작 흐름

  1. 스레드에서 sendMessage()를 활용하여 메인 쓰레드(UI Thread)의 MessageQueue에 메세지를 전달.

  2. 메인스레드의 Looper는 MessageQueue에서 메세지를 하나씩 Handler에 전달.

  3. Handler에서 handleMessage()를 통해 메세지를 처리함.

Handler는 MessageQueue와, MessageQueue 안의 메세지들을 자신에게 전달해주는 Looper에게 의존적임을 생각해볼 수 있다.

사용 예제(추후 추가예정)

0개의 댓글