본문 바로가기

Mobile/Android

UI Thread와 Handler

반응형

안드로이드 어플리케이션에서 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, ... 등)에 반응하지 못하는 일이 발생할 수 있다.


반응형