Skip to content

Android.os.Handler

What is Handler

  • 쓰레드간 상호작용을 위한 일반적인 목적의 클래스
  • 작업 쓰레드(=자식 쓰레드)에서 부모 쓰레드(=Handler 객체를 생성한 쓰레드)에 Message 및 Runnable(부모 쓰레드에서 처리할 작업) 전달(send/post 메소드)
  • 자식 쓰레드에서 handler를 통해 전달되는 Message와 Runnable은 부모 쓰레드의 메시지큐에 들어감
  • 내부적으로 Runnable도 결국은 Message로 변환(Message.callback=runnable)되어 메시지큐에 들어감
  • Handler 객체를 생성한 쓰레드(부모 쓰레드)에서는 Looper를 통해 MessageQueue를 만들어 놓아야 함
  • UI쓰레드(= main쓰레드)는 ActivityThread.main()에 의해 생성되는데, 여기서 Looper를 통해 UI 쓰레드용 메시지 큐가 이미 만들어져 있으므로 우리가 UI 쓰레드용 메시지큐를 만들 필요는 없음
  • HandlerThread클래스는 Looper를 가진 쓰레드를 쉽게 만들기 위한 용도

Example

// --------------
// Event handler.
// --------------

/** 이벤트 핸들러. */
private static class EventHandler extends Handler {

    /** 비디오화면(View)이 마지막에 도착하였다. */
    public static final int kMessageVideoViewGoEnd = 0x00000001;
    /** 비디오화면(View)이 마지막에서 다시 돌아간다(다시 마지막이 아니다). */
    public static final int kMessageVideoViewReturnEnd = 0x00000002;

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case kMessageVideoViewGoEnd:
            break;
        case kMessageVideoViewReturnEnd:
            break;
        }
        // super.handleMessage(msg);
    }
}

private EventHandler _event_handler = new EventHandler();

/** 비디오화면(View)이 마지막에 도착하였다. */
public void sendMessageGoEnd() {
    Message msg = _event_handler.obtainMessage(EventHandler.kMessageVideoViewGoEnd);
    _event_handler.sendMessage(msg);
}

/** 비디오화면(View)이 마지막에서 다시 돌아간다(다시 마지막이 아니다). */
public void sendMessageReturnEnd() {
    Message msg = _event_handler.obtainMessage(EventHandler.kMessageVideoViewReturnEnd);
    _event_handler.sendMessage(msg);
}

Favorite site

References


  1. Android_Handler_Story_-_Handler_and_Looper.pdf 

  2. Android_Handler_Story_-_Messenger_Service.pdf 

  3. Android_how_to_use_handler.pdf