
루퍼는 무한루프를 돈다
작업단위
- Message는 하나의 작은 작업 단위라고 생각하면 편한데, Runnable 객체로 이루어져 있을 수도 있고 일반적인 경우 Message 객체로 이루어져 있을 수 있다.
- Runnable, Message 객체 두가지가 있을 수 있는데, Runnable 객체가 담겨져 있으면 handler에 메세지를 전달하지 않고 run()을 수행하여 해당 Runnable 작업을 바로 시작하고, Runnable 객체가 없을 경우 Message 객체 내부에 명시돼있는 handler의
handleMessage()를 수행하며
Message 객체를 생성하여 이를 전달하는 방식으로 구현한다.
sendMessage()로 MessageQueue에 Message 객체를 적재Looper가 메세지 큐에서 메세지 하나를 딱 꺼냈을 때,
run() 메소드를 호출해서 작업을 실행Message 객체가 담겨있다면
handleMessage()메소드를 호출함으로써 해당 Handler가 메세지를 전달받을 수 있다.
다른 Thread에서 특정 Thread Handler의 sendMessage() 를 활용하여 Main Thread Looper의 MessageQueue에 메세지를 전달함
해당 Thread의 Looper는 MessageQueue에서 loop()를 통해, 메세지를 하나씩 handler에 전달함
Handler에서 handleMessage()를 통해 메세지 처리함
-> 메인 Thread가 갖고 있는 Looper의 MessageQueue에 다른 Thread의 결과를 활용한 작업들을 담아두면, Main Thread의 handler가 이를 차례대로 수행하게 되는 것이다.
var handler: Handler? = null
val thread = Thread { // Runnable 익명 객체 구현
handler = Handler(Looper.getMainLooper())
}
thread.start()
이렇게 하지 않으면 Handler가 암시적으로 Looper를 선택하게 되는데, 이 과정에서 특정 작업이 손실되거나 충돌하는 버그가 발생할 수 있다.
Thread를 사용하는 방법은 상속을 해서 run()을 재구현하는 방법이 있고 Runnable() interface를 강제구현해서 하는 방법이 있다.