본문 바로가기
Programming/Android Java

Handler와 Looper

by 개Foot/Dog발?! 2015. 7. 15.

추가 조사 후 정리를 해야겠지만

잊지 않기 위해 주저리 주저리 메모


우리가 쓰고 있는 일반적인 Handler는 소위 main Thread에 것을 사용하는 것이다.

즉, UI에 연결된 Thread이다. Activity의 경우 그렇다

Service의 경우 Service에 대한 Thread일 것이다.

main Thread에서 hang up이 오래 걸리는 코드를 작성하게 되면 ANR이 발생하기도 하는데

그래서 그러한 작업은 별도의 Thread를 생성하여 처리하도록 한다.

Handler도 마찬가지이다.

일반적으로 그렇게 코드를 작성하지도 않지만, Handler에 엮인 특히 handleMessage()같은 메서드에서

작업시간이 긴 코드가 동작하게 될 경우 문제가 발생할 가능성이 높다.


이것을 이해하기 위해서는

Handler는 Handler단독으로 사용할 수 없음을 인지하고 있어야 한다.

우리가 일반적으로 Handler handle = new Handler() 코드를 사용하능 한 것은

main Thread내에서 할 경우 MessageQueue에서 message를 가져오는 Looper가 기본적으로 생성되어 있기 때문이다.

즉, mainThread에서 하나의 MessageQueue와 하나의 Looper가 이미 생성되어 있다.

그래서 기본생성자로 Handler를 생성하여도 main Thread의 Looper를 사용하게 된다.

그래서 편리하게 사용할 수 있는 것이다.

그렇게 Handler는 Looper와 연관되게 된다. 

즉, Message Queue로 부터 message를 가져와 Handler로 전달할  Looper가 꼭 필요하다.

또한 Looper와 Handler의 관계는 Looper : Handler = 1 : * 이다. 즉 한 Looper에 여러 Handler가 붙을 수 있다.

한 쓰레드에서는 한 Looper만 존재할 수 있다.


다른 쓰레드에서 main Thread의 Handler를 사용할 것이 아니라면,

해당 쓰레드에서 Looper를 생성하여 Handler를 이용해야 한다.


간단한 앱의 경우 mainThread에것만을 사용하고 처리로직은 별도 Thread로 처리하여도 문제가 되지 않지만,

구조적으로 쓰레드는 그래도 반응이 느릴 수 도 있기 때문에 쓰레드를 안쓰다거나, 적절한 쓰레드 수를 조절한다거나, 다중쓰레드간 자원문제 등 구조적으로 mainThread와 엮어서 사용할 경우 mainThread에 영향을 미칠 수 있는 구조가 발생할 경우

main Thread와는 분리된 다른 Thread간 Handler와 Looper를 생성하여 제어해야할 필요가 있지 않을까 생각된다.



참고로 쓰레드를 생성하면 스택, 메시지큐, static 메모리 영역등을 확보하게 된다.


ref Url : http://warmz.tistory.com/588

ref URL : https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/Handler.java