이번 포스팅은 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()
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();
HandlerThread mHandlerThread = new HandlerThread("HandlerName");mHandlerThread.start();
Handler handler = new Handler( handlerThread.getLooper() );
Reference
1. https://aroundck.tistory.com/1022 [돼지왕 왕돼지 놀이터]
'Development > Java' 카테고리의 다른 글
[Java] Java Class 파일 DeCompile (0) | 2020.04.08 |
---|---|
[Java] StringBuffer vs StringBuilder (0) | 2019.09.26 |
[Java] System.arraycopy 사용법 (0) | 2019.09.04 |