SlideShare a Scribd company logo
Handler/Message/Looper
& AsyncTask
Handler 개요
• 안드로이드의 UI는 단일 스레드 모델이기 때문에 UI단에
서 스레드를 사용하고 싶다면, 별도 Thread를 만들어서
사용을 해야 합니다.
• 그런데, 별도 Thread에서는 메인 Thread에 속한 자원에
접근을 금지하고 있습니다. 즉 자신 Thread만 접근이 가
능해야 합니다. 이를 우회하기 위한 방법이 필요합니다.
• 이러한 상황에 대한 대안이 바로 Handler입니다.
CalledFromWrongThreadException 이 발생
출처: http://tigerwoods.tistory.com/26
Handler 좀 더 알아보자
• 쓰레드 간에 메시지를 주고 받는 통로 역할
o 쌍방향성은 아닌, 메인쓰레드로만 메시지 전달이 가능
o 이는 ���퍼가 있는가 여부에 의한 것입니다. 물론 메인 쓰레드가 아닌 경
우에는 명시적으로 Looper를 생성하면 됩니다.
• Handler는 생성이 되는 시점에, 해당 Handler가 생성이 되는 Thread의
MessageQueue와 Looper에 연결이 됩니다.
• Handler 통해서 Message 객체나 Runnable 객체를 전달할 수 있습니다. 이
렇게 전달되는 객체들은 MessageQueue에 쌓이게 됩니다.
o post(), postDelayed()를 통해서 인자로 실행하고자 하는 Runnable객
체를 전달할 수 있다.
• Looper에 의해서 MessageQueue에 있는 객체들이 차례로 추출이 되어
Handler에 의해서 처리가 됩니다.
출처: http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110115454542
Message 객체
• 효율성을 위해서, 재활용을 원칙으로 하고 있습니다. 본 객체는 기본적으로 여러 번
사용이 되기 때문에, 재활용하지 않는 경우에 메모리 문제를 양산 가능
• 메세지 객체는 아래 함수를 통해서 받아오고 이를 재활용하도록 구현합시다.
innerClass가 아닌 경우에는
생성자에 Handler를 전달해서 길을 뚫어둡니다.
주거니, 받거니~
Handler 용도
• enqueue an action to be
performed on a different
thread than your own
o 이에 대해서는 앞서 많이
보아온 것입니다.
• schedule messages and
runnables to be executed as
some point in the future
o 본 기능은 기능의 다른
측면으로서, 일정 시간을
지연한 뒤에 메시지가 실
행이 되게 처리하게 하여,
특정 시점에 수행이 되게
하는 방법입니다.
출처 http://stackoverflow.com/questions/2857101/schedule-task-in-android
UI 측면에서만 전문화 하면 ..
• 지금까지 알아본 방법을 통해서도, UI 작업에 지체되는 작
업들을 별도 thread로 만들고 필요한 경우에 message를
UI thread에 전달을 해서 화면 구성을 변경할 수 있습니다.
• 그렇지만, 이렇게 하면 관련 코드가 여러 곳에 분산이 되
고, 각기 다른 형태로 메시지들이 난발하는 현상이 발생될
수 있습니다.
• 그래서 제시된 것이 AsyncTask 입니다.
AsyncTask 구성
20 handler and_async_task
+ onCancelled : cancel 처리가 될 때에 대한 callback
UI Thread에서 수행
UI 업데이트 가능
AsyncTask 주의 사항
• Activity 종료 시 AsyncTask 객체를 소멸시키지 않으면, Activity가
종료되고 나서도 AsyncTask는 계속 살아서 동작을 하게 됩니다.
그리고 다시 해당 Activity가 활성화가 되면, AsyncTask가 실행 될 때
종료되지 않은 AsyncTask와 충돌이 나게 됩니다.
• AsyncTask를 사용하는 경우에 반드시 Activity 종료 시에는 같이
종료를 챙기도록 합니다.

More Related Content

20 handler and_async_task

  • 2. Handler 개요 • 안드로이드의 UI는 단일 스레드 모델이기 때문에 UI단에 서 스레드를 사용하고 싶다면, 별도 Thread를 만들어서 사용을 해야 합니다. • 그런데, 별도 Thread에서는 메인 Thread에 속한 자원에 접근을 금지하고 있습니다. 즉 자신 Thread만 접근이 가 능해야 합니다. 이를 우회하기 위한 방법이 필요합니다. • 이러한 상황에 대한 대안이 바로 Handler입니다.
  • 5. Handler 좀 더 알아보자 • 쓰레드 간에 메시지를 주고 받는 통로 역할 o 쌍방향성은 아닌, 메인쓰레드로만 메시지 전달이 가능 o 이는 루퍼가 있는가 여부에 의한 것입니다. 물론 메인 쓰레드가 아닌 경 우에는 명시적으로 Looper를 생성하면 됩니다. • Handler는 생성이 되는 시점에, 해당 Handler가 생성이 되는 Thread의 MessageQueue와 Looper에 연결이 됩니다. • Handler 통해서 Message 객체나 Runnable 객체를 전달할 수 있습니다. 이 렇게 전달되는 객체들은 MessageQueue에 쌓이게 됩니다. o post(), postDelayed()를 통해서 인자로 실행하고자 하는 Runnable객 체를 전달할 수 있다. • Looper에 의해서 MessageQueue에 있는 객체들이 차례로 추출이 되어 Handler에 의해서 처리가 됩니다.
  • 7. Message 객체 • 효율성을 위해서, 재활용을 원칙으로 하고 있습니다. 본 객체는 기본적으로 여러 번 사용이 되기 때문에, 재활용하지 않는 경우에 메모리 문제를 양산 가능 • 메세지 객체는 아래 함수를 통해서 받아오고 이를 재활용하도록 구현합시다.
  • 8. innerClass가 아닌 경우에는 생성자에 Handler를 전달해서 길을 뚫어둡니다. 주거니, 받거니~
  • 9. Handler 용도 • enqueue an action to be performed on a different thread than your own o 이에 대해서는 앞서 많이 보아온 것입니다. • schedule messages and runnables to be executed as some point in the future o 본 기능은 기능의 다른 측면으로서, 일정 시간을 지연한 뒤에 메시지가 실 행이 되게 처리하게 하여, 특정 시점에 수행이 되게 하는 방법입니다. 출처 http://stackoverflow.com/questions/2857101/schedule-task-in-android
  • 10. UI 측면에서만 전문화 하면 .. • 지금까지 알아본 방법을 통해서도, UI 작업에 지체되는 작 업들을 별도 thread로 만들고 필요한 경우에 message를 UI thread에 전달을 해서 화면 구성을 변경할 수 있습니다. • 그렇지만, 이렇게 하면 관련 코드가 여러 곳에 분산이 되 고, 각기 다른 형태로 메시지들이 난발하는 현상이 발생될 수 있습니다. • 그래서 제시된 것이 AsyncTask 입니다.
  • 13. + onCancelled : cancel 처리가 될 때에 대한 callback UI Thread에서 수행 UI 업데이트 가능
  • 14. AsyncTask 주의 사항 • Activity 종료 시 AsyncTask 객체를 소멸시키지 않으면, Activity가 종료되고 나서도 AsyncTask는 계속 살아서 동작을 하게 됩니다. 그리고 다시 해당 Activity가 활성화가 되면, AsyncTask가 실행 될 때 종료되지 않은 AsyncTask와 충돌이 나게 됩니다. • AsyncTask를 사용하는 경우에 반드시 Activity 종료 시에는 같이 종료를 챙기도록 합니다.