티스토리 뷰


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.


서론




 이전 포스팅 (Thread, Handler, Looper를 이용한 백그라운드 처리) 에서 언급했듯이, 안드로이드 OS 는 UI 자원에 Main Thread와 Sub Thread가 동시 접근하여 동기화 이슈를 발생시키는 것을 방지시키기 위해 UI 자원 사용은 UI Thread에서만 가능하도록 만들었다고 했습니다. 그래서 Handler.post( ) 와 같은 스레드 간 메시지 전달을 통해서 구현하도록 했었죠. 안드로이드에서 제공하는 Message나 Runnable 객체를 UI 스레드 쪽에서 동작시키기 원할 경우 사용하는 방법 4가지가 있습니다.



  1.  Activity.runOnUiThread( )

  2.  Handler.post( )

  3.  View.post( )

  4.  AsyncTask 클래스


 두 번째 방법은 이전 포스팅에서 사용방법을 설명했으니 참고하시고, 이번 포스팅에서는 더욱 간단하게 Sub Thread에서 UI 자원을 다루기 위한 방법인 runOnUiThead에 대해서 설명해보도록 하겠습니다. (runOnUiThread와 Handler 를 사용하는 방법의 차이는 Handler는 post 방식을 통해 매번 이벤트를 발생시키지만, runOnUiThread는 현재 시점이 UI 스레드이면 바로 실행시킨다는 점에서 좀 더 효율적이라고 할 수 있습니다.)





runOnUiThread 의 개념


Added in API level 1
void runOnUiThread (Runnable action)

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
actionRunnable: the action to run on the UI thread

 

 Android Developers 에서의 정의를 보면 쉽게 이해가 가능한 개념입니다. 즉 현재 스레드가 UI 스레드라면 UI 자원을 사용하는 행동에 대해서는 즉시 실행된다는 것이고, 만약 현재 스레드가 UI 스레드가 아니라면 행동은 UI 스레드의 자원 사용 이벤트 큐에 들어가게 되는 것 입니다.




runOnUi Thread 의 구조

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

 위 코드는 실제 Activity.runOnUiThread( )의 구현 코드 입니다. 위에 설명한 정보와 정확히 일치하는 모습을 볼 수 있습니다. Thread.currentThread( )로 현재 스레드가 UI 스레드인지 확인하고 맞으면 바로 실행, 틀리면 핸들러를 통해서 UI 스레드의 이벤트 큐로 post 하는 것을 볼 수 있습니다. 




runOnUiThread 의 사용법

new Thread(new Runnable() { @Override public void run() { for(i = 0; i<=100; i++) { // 현재 UI 스레드가 아니기 때문에 메시지 큐에 Runnable을 등록 함 runOnUiThread(new Runnable() { public void run() { // 메시지 큐에 저장될 메시지의 내용 textView.setText("runOnUiThread 님을 통해 텍스트 설정"); } }); } } }).start();


자신 혼자서는 UI 자원을 절대 사용할 수 없는 Sub Thread도 Handler의 사용에 비해 이렇게 간단한 방법으로 Main Thread(UI Thread)에 소원을 빔으로서 UI 제어를 쉽게 할 수 있습니다.




댓글
댓글쓰기 폼