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

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

이제 자세히 Handler와 Looper에 대해서 알아보자.
먼저 Looper의 구조를 보자.

Looper는 한 스레드에 1개만 존재할 수 있으며, 내부에 MessageQueue가 존재한다.
MessageQueue는 해당 스레드가 처리해야 할 동작들이 메세지 라는 형태로 하나씩 쌓인다. 쌓인 Messasge는 FIFO 방식으로 하나씩 적절한 Handler로 보내진다.
(여기서 적절한 Handler라는 말은 수신 대상 Thread에서 생성한 Handler로 보낸다는 뜻이다. 자세한 설명은 아래 Handler 설명에서 하겠다.)
한 마디로 정리하면 Looper는 무한 루프를 돌면서 자신의 MessageQueue에 있는 메세지들을 하나씩 꺼내어 Handler에서 처리하도록 전달한다.
Handler에서 어떻게 처리하는지는 아래에서 설명하겠다.
Handler는 두 가지의 역할을 수행한다.
메세지 큐에는 두 가지 형태의 메세지가 담길 수 있다.