MessageQueue, Looper, Handler, HandlerThread

kimji1
4 min readMar 19, 2020

--

// todo 코드와 이미지 추가하기

MessageQueue

  • 메세지는 스레드 간의 신호
  • 메세지를 쌓아두는 공간

Looper

  • MessageQueue에서 Message를 꺼내서 핸들러로 전달하는 작업 수행
  • 하나의 스레드는 오직 하나의 Looper만 가질 수 있음
  • Looper는 MessageQueue가 비어있는 동안은 아무 행동도 하지 않고,
    메세지가 들어오면 해당 메세지를 꺼내 적절한 Handler로 전달
  • Looper.prepare()를 통해 messageQueue를 준비
  • Looper.loop()를 호출함으로써 Message를 기다리는 작업이 시작 됨
  • Activity에서 onDestroy() 콜백 호출 시 handler.getLooper().quit()을 이용해 꼭 종료시켜줘야 함

Handler

  • 기본 생성자를 통해 Handler를 생성하면, 생성되는 Handler는 해당 Handler를 호출한 스레드의 MessageQueue와 Looper에 자동 연결
  • 생성자의 파라미터에 특정 Thread의 Looper를 넘겨 Looper와 연결할 수 있음
  • 메세지가 도착하면 handleMessage(Message msg) 메서드가 호출됨
  • 메세지 전송 시에는 sendEmptyMessage(int what)/sendMessage(Message msg), sendMessageAtFrontOfQueue(Message msg) 의 메서드를 이용
  • post(Runnable)를 통해 객체를 보낼 수도 있음, Runnable 객체를 보내면 해당 객체의 run 메서드가 실행됨

HandlerThread

  • Looper를 가진 Thread
  • Looper는 Handler를 생성할 수 있음
  • Thread처럼 Thread.start()는 여전히 호출해주어야 함

--

--

kimji1
kimji1

No responses yet