반응형

이번 포스팅은 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 [돼지왕 왕돼지 놀이터]

 

반응형

'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

+ Recent posts