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 객체
• 효율성을 위해서, 재활용을 원칙으로 하고 있습니다. 본 객체는 기본적으로 여러 번
사용이 되기 때문에, 재활용하지 않는 경우에 메모리 문제를 양산 가능
• 메세지 객체는 아래 함수를 통해서 받아오고 이를 재활용하도록 구현합시다.
- 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 입니다.
- 14. AsyncTask 주의 사항
• Activity 종료 시 AsyncTask 객체를 소멸시키지 않으면, Activity가
종료되고 나서도 AsyncTask는 계속 살아서 동작을 하게 됩니다.
그리고 다시 해당 Activity가 활성화가 되면, AsyncTask가 실행 될 때
종료되지 않은 AsyncTask와 충돌이 나게 됩니다.
• AsyncTask를 사용하는 경우에 반드시 Activity 종료 시에는 같이
종료를 챙기도록 합니다.