[Android] Handler와 Looper의 개념

minH_·2024년 5월 3일

해당 포스트에선 개념에 대해서만 다룹니다.

안드로이드 개발을 진행하다 보면 여기저기서 오직 메인 스레드 에서만 UI 작업을 할 수 있다는 사실을 접했을것이다.
다음과 같은 상황을 생각해보자.

동시에 두 스레드가 TextView에 접근하면 어떤 결과가 나올지 보장하기 힘들다. 따라서 동작의 무결성을 보장하기 위해 메인 스레드 이외의 스레드(Worker Thread) 는 UI 관련 동작을 수행할 수 없고, 오로지 메인 쓰레드에서만 UI 관련 동작을 할 수 있도록 정해져있다.

아래 그림과 같이 워커 스레드에서 작업을 수행한 후 Handler를 통해 메인 스레드로 전달한다.

이제 자세히 Handler와 Looper에 대해서 알아보자.

Looper

먼저 Looper의 구조를 보자.

Looper는 한 스레드에 1개만 존재할 수 있으며, 내부에 MessageQueue가 존재한다.
MessageQueue는 해당 스레드가 처리해야 할 동작들이 메세지 라는 형태로 하나씩 쌓인다. 쌓인 Messasge는 FIFO 방식으로 하나씩 적절한 Handler로 보내진다.
(여기서 적절한 Handler라는 말은 수신 대상 Thread에서 생성한 Handler로 보낸다는 뜻이다. 자세한 설명은 아래 Handler 설명에서 하겠다.)

한 마디로 정리하면 Looper는 무한 루프를 돌면서 자신의 MessageQueue에 있는 메세지들을 하나씩 꺼내어 Handler에서 처리하도록 전달한다.

Handler에서 어떻게 처리하는지는 아래에서 설명하겠다.

Handler

Handler는 두 가지의 역할을 수행한다.

  • Looper로부터 전달받은 메세지를 처리
  • 다른 스레드로부터 받은 메세지를 MessageQueue에 보관

Looper로부터 전달받은 메세지 처리

메세지 큐에는 두 가지 형태의 메세지가 담길 수 있다.

  1. Runnable
  • 해당 Runnable 객체의 run() 메소드를 실행하여 처리 (해당 Handler에서 처리)
  1. Message
  • 해당 메세지 내부의 Handler 가 갖고 있는 handleMessage() 메소드를 호출하여 Handler 가 메세지를 전달받을 수 있다. -> 다른 스레드가 생성한 Handler에서 메세지 처리

다른 스레드로부터 받은 메세지 MessageQueue에 보관

  1. 메세지의 형태가 Runnable인 경우
  • post... 메소드를 이용하여 Runnable 객체 전달
  1. 메세지의 형태가 Message인 경우
  • sendMessage() 메소드를 이용하여 Message 전달

0개의 댓글