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