이번 포스팅은 Thread에서 많이 사용하는 Handler에 대하여 알아보도록 하겠습니다.
1. Handler는 늘 Thread와 연결되어 있어야만 정상적인 기능을 하고, 그 Thread에는 메세지를 담을 수 있는 MessageQueue와 Handler로 메세지를 전달해주는 Looper가 있어야 합니다.
2. Main Thread는 위의 MessageQueue와 Looper를 기본적으로 하나씩 가지고 있습니다. 그래서 Main Thread에서 new Handler() 라는 기본 생성자를 통해 Handler를 생성해도 잘 작동합니다. (단, 모든 Thread가 MessageQueue와 Looper가 있는 것은 아닙니다.)
3. 기본 생성자를 통해 Handler를 생성하면, 생성자가 그 Handler가 있는 Thread의 MessageQueue와 Looper에 자동으로 연결이 됩니다.
4. 2번에서 언급하였듯이 모든 Thread가 MessageQueue와 Looper가 있는 것은 아니기 때문에 Looper가 없는 Thread에서 Handler를 생성하려 하면, 아래와 같은 오류가 발생합니다.
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
5. 한 Thread에서 Looper는 하나만 존재하고, 하나의 MessageQueue에만 연결이 됩니다. 하지만 여러 Handler와 연결될 수 있습니다. 이것이 가능한 이유는 Message 객체로부터 어떤 Handler에 전달되야 하는 메세지인지 알 수 있기 때문입니다.
6. Looper를 생성하는 방법은 생성한 Thread에서 Looper.prepare()를 호출하고, Looper.loop()를 실행하는 것입니다.
Looper는 무한루프를 돌기때문에, Handler를 더 이상 사용하지 않을 때에는 Looper.quit()를 호출해주어야 합니다.
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
Looper.prepare();
handler = new Handler();
Looper.loop();
}
});
thread.start();
7. Looper를 생성하는 간단한 방법은 Handler Thread 를 사용하는 것입니다. Handler Thread는 기본적으로 Looper를 가지고 있고, 해당 Thread를 start() 함수를 호출하면 자동으로 loop도 돌게 됩니다.
HandlerThread mHandlerThread = new HandlerThread("HandlerName");
mHandlerThread.start();
Handler handler = new Handler( handlerThread.getLooper() );
Reference
1. https://aroundck.tistory.com/1022 [돼지왕 왕돼지 놀이터]