본문 바로가기
Lecture/Advanced Android

[runOnUiThread] 정확하게 알고 쓰는 UI Thread

by 알 수 없는 사용자 2013. 6. 18.
반응형

안녕하세요. 새롭게 Android Advenced Lecture 파트를 담당하게 된 Polarux 입니다. 

첫번째 강의로 선택한 주제는 runOnUiThread 에 대해서 입니다. 

runOnUiThread 는 많은 개발자들이 무턱대고 이용하다가 피를 보는 크리티컬한 요소입니다.

runOnUiThread 는 무엇이며, 어떻게 동작시켜야 제대로 UI 처리를 할 수 있는지에 대해서 알아보겠습니다.

꼼꼼히 글을 읽고 사용된 예제를 정확히 이해하신다면 매우 효과적으로 UI를 제어하실 수 있을 것입니다.



우선 runOnUiThread 가 무엇인지 정의하겠습니다.

developer.android.com 의 Document 에서 정의하는 runOnUiThread 는 아래와 같습니다.

public final void runOnUiThread (Runnable action)

Added in API level 1

Runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.

Parameters
actionthe action to run on the UI thread

즉, UI 변화에 관련된 모든 처리를 담당하는 Thread 입니다. 

runOnUiThread 는 UI 를 변형하는 액션에 대해서는 즉시 동작하지만, 그렇지 않은 액션에 대해서는 UI Thread 의 event queue 로 처리를 넘기어 지연시킵니다.

이 Method 는 마치 평범한 Thread 의 생성구문 처럼 Runnable 을 매개변수로 사용합니다. UI 변화를 주고자 하는 일련의 처리를 Runnable 로 묶어서 매개변수로 던져주면 그대로 처리해 주는 아주 간단한 메커니즘을 가지고 있습니다.



대충 runOnUiThread 가 무엇인지 감이 잡혔을 겁니다. 

그렇다면 어째서 UI Thread 를 따로 관리해야 하는지에 대해서 알아보겠습니다. 

단순하게 생각하면, 출력할 장소가 마련되어야 결과를 출력할 수 있기 때문이라고 할 수 있습니다. 예를 들면,

"열심히 알고리즘 구축해서, 열심히 Thread 구성하고, Synchronized 까지 진행해서 모든 데이터가 완벽해! 이제 모든 처리를 끝냈으니 결과를 화면으로 찍어볼까? 어? 아직 화면 구성이 안되있네?"

와 같은 문제가 발생할 수 있습니다. 따라서 UI 처리 루틴은 실제 사용자가 구동할 프로그램과는 조금 다른 루틴에서 단독적으로 끝나야 한다는 것입니다.

하지만 많은 프로그래머 분들이 의구심을 갖는 부분은 보통 다른 플랫폼에서 프로그래밍은 UI 관련된 처리를 전혀 고려할 필요가 없이 자유롭게 바꿔왔던것 같은데 왜 유독 안드로이드에서는 UI 처리를 복잡하게 처리해야 하는가 하는 것입니다.

실제로 거의 모든 플랫폼은 UI 프로세스 처리에 사용자 프로세스 처리보다 높은 우선순위를 부여합니다. 따라서 사용자 프로세스가 처리되기 전에 UI 프로세스가 완료되어 있는 것이 보통입니다. 하지만 어떠한 이유인지 알 수 없으나 안드로이드는 UI 프로세스와 사용자 프로세스의 우선순위가 queue 로 들어오는 순서에 따라 처리됩니다. (이는 전적으로 개발자의 역량에 모든 것을 전임했다고 해석할 수도 있으나, 하드웨어의 충분한 커버가 없다면 문제가 발생할 여지가 다분합니다.)



서론이 너무 길었습니다. 이제 본격적으로 runOnUiThread 의 사용법에 대해서 알아보도록 하겠습니다.

runOnUiThread 를 사용하기 위해서는 먼저 Activity 객체가 필요합니다. UI 를 변경하고자 하는 클래스가 Activity 클래스를 상속하고 있다면 문제는 제법 간단하게 해결되겠지요.