반응형
안드로이드 어플리케이션에서 UI 와 관련된 동작은 UI Thread 내에서 실행되어야 한다.
웹과 연동되거나 시간이 오래 걸리는 작업의 결과를 화면에 표시하는 등 다른 Thread 에서 UI 를 변경하려 한다면 다음과 같은 에러메시지를 볼 수 있다.
"android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views." |
"View 구조를 생성한 Thread 에서만 해당 View 를 만질 수 있다."
예를 들어, Activity 에서 Xml 에 정의된 UI Component 를 초기화 한 뒤 OnClickLisner 또는 사용자가 정의한 또 다른 클래스에서 그 UI 에 접근하고자 할 때 이러한 메시지를 만난다.
그럼 시간이 오래걸리는 작업을 해야하거나 어떤 이벤트 혹은 콜백을 받아 처리해야 하는 일(UI 와 관련된)을 해야할 때 이러한 Error 메시지를 피하기 위해선 어떻게 해야할까?
안드로이드에서는 다음의 메서드 등을 이용하거나
Activity.runOnUiThread(Runnable action) View.post(Runnable action) View.postDelayed(Runnable action, long delayMillis) |
android.os.Handler 클래스를 이용하여 이 문제를 해결할 수 있다.
A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue . Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue. |
시간이 오래 걸리는 작업을 해야할 때 에는 Worker Thread 에서 수행하도록 작성하는 것이 좋다. UI Thread 에서 시간이 오래 걸리는 작업을 하게 되면 그 수행시간동안 UI Thread 가 Block 되어 사용자의 동작(Click, Drag, Touch, ... 등)에 반응하지 못하는 일이 발생할 수 있다.
반응형
'Mobile > Android' 카테고리의 다른 글
맥(Mac) 에서 Android Studio 로 Android 개발하기 (0) | 2015.03.25 |
---|---|
맥(Mac) 에서 Eclipse 로 Android 개발하기 (1) | 2015.03.25 |
안드로이드 소스 다운로드 (0) | 2013.06.18 |
Activity Lifecycle (0) | 2013.06.14 |
안드로이드 Low memory killer 의 Threshold (0) | 2010.06.30 |
한글 계정에서 안드로이드 AVD 실행 시 발생하는 Error 해결 방법 (0) | 2010.06.30 |
Android NDK 설치 (0) | 2010.04.19 |
Android Emulator 한글 설정 (1) | 2010.04.05 |
Command 에서 안드로이드 가상 머신(AVD) 생성하기 (0) | 2010.04.02 |
Android Emulator Scaling(크기 조정) (0) | 2010.03.22 |