Can't create handler inside thread that has not called Looper.prepare()

2014. 5. 4. 01:13Programing/Debugging

해결 방안
Handler mHandler = new Handler(Looper.getMainLooper()) {


원인 : http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110115454542

만일 Handler 와 연결된 Thread 를 명시적으로 지정하고 싶을 때는, 제공되는 Handler (Looper looper) 생성자를 사용하실 수도 있습니다. 그런데, 이때 사용되는 Looper 클래스는 정확히 어떤 역할을 수행할까요?
ERROR/AndroidRuntime(15412): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
 만일 정상적인 Looper 가 없는 스레드에서 Handler 를 생성하려고 할 때는, 위와 같은 예외가 발생하게 됩니다. 그렇다면 Looper 는 무슨 일을 할까요? Looper 는 한 마디로 말해 하나의 스레드를 점유하여(하나의 스레드는 하나의 Looper 만 갖을 수 있습니다. Looper 도 오직 하나의 스레드에만 연결될 수 있구요.) MessageQueue 만을 바라보는 해바라기 입니다. MessageQueue 가 비어 있는 동안은 아무일도 안하고 계속 잠만 자고 있다가, 메세지가 들어오면 해당 메세지를 꺼내 적절한 Handler 로 전달해 주지요. 이 역할을 끊도 없이 반복적으로 수행하기 때문에 Looper 라는 이름이 붙었습니다.

 따라서, 이 Looper 가 동작하고 있는 스레드는 메세지를 처리하는 일 외에 다른 일을 수행할 수가 없습니다. 그리고 하나의 메세지를 처리하는데 너무 오랜 시간이 걸리는 작업을 수행해서도 안됩니다. 하나의 메세지를 처리하는 동안에는 해당 Looper 를 향해 전달된 다른 메세지들은 처리되지 못하고, MessageQueue 에 산더미 처럼 쌓이고 자신의 순서가 돌아오기만을 기다리게 되기 때문입니다. 만일 어플리케이션 메인 스레드의 Looper 에서 이런 일이 일어난다면? 네.. 많은 개발자들을 우울하게 만드는 ANR(Application Not Responding) 예외가 발생하게됩니다. (메인 스레드가 아니면 ANR 이 발생하지 않습니다~~)