Looper
하나의 스레드는 오직 하나의 Looper
를 가지며, 안드로이드에선 기본적으로 MainActivity
가 실행됨과 동시에 자동으로 메인 스레드의 Looper
가 돌기 시작한다.
Looper
내부에는 MessageQueue
가 존재하는데, 여기에는 해당 스레드가 처리해야 할 동작들이 메세지(Message
)라는 형태로 하나씩 쌓이게 되고, Looper
는 이 메세지들을 하나씩 꺼내어 이를 적절한 Handler
로 전달하는 역할을 한다.
메세지는 하나의 작은 작업 단위로, 메세지 객체 혹은 Runnable
객체로 이루어져 있다.
Looper
는 어떤 Handler
에 메세지를 전달해야 하는지에 대한 참조를 가지고 있으며, 만약 MessageQueue
가 비어있다면 아무런 동작을 수행하지 않는다.
Handler
Handler
는 특정 메세지를 Looper
의 MessageQueue
에 넣거나, Looper
의 MessageQueue
에서 특정 메세지를 꺼내어 전달하면 이를 처리하는 기능을 수행하는 중간 다리 역할을 한다.
Looper
로 메세지를 전달하는 경우에는 sendMessage()
메소드를 통해 MessageQueue
에 메세지 객체를 담을 수 있고, post
로 시작하는 메소드들을 통해 Runnable
객체를 담을 수 있다.
Looper
로 메세지를 전달받는 경우에는 메세지에 Runnable
객체가 담겨있다면 Runnable
의 run()
메소드를 호출해서 작업을 실행할 수 있고, 메세지 객체가 담겨있다면 메세지 내부의 Handler
가 갖고 있는 handleMessage()
메소드를 호출해서 해당 Handler
가 메세지를 전달받을 수 있다.