이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
이전 포스팅 (Thread, Handler, Looper를 이용한 백그라운드 처리) 에서 언급했듯이, 안드로이드 OS 는 UI 자원에 Main Thread와 Sub Thread가 동시 접근하여 동기화 이슈를 발생시키는 것을 방지시키기 위해 UI 자원 사용은 UI Thread에서만 가능하도록 만들었다고 했습니다. 그래서 Handler.post( ) 와 같은 스레드 간 메시지 전달을 통해서 구현하도록 했었죠. 안드로이드에서 제공하는 Message나 Runnable 객체를 UI 스레드 쪽에서 동작시키기 원할 경우 사용하는 방법 4가지가 있습니다.
Handler.post( )
View.post( )
두 번째 방법은 이전 포스팅에서 사용방법을 설명했으니 참고하시고, 이번 포스팅에서는 더욱 간단하게 Sub Thread에서 UI 자원을 다루기 위한 방법인 runOnUiThead에 대해서 설명해보도록 하겠습니다. (runOnUiThread와 Handler 를 사용하는 방법의 차이는 Handler는 post 방식을 통해 매번 이벤트를 발생시키지만, runOnUiThread는 현재 시점이 UI 스레드이면 바로 실행시킨다는 점에서 좀 더 효율적이라고 할 수 있습니다.)
runOnUiThread 의 개념
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 | |
---|---|
action | Runnable : 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();
}
}
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
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();
'Frontend > Android' 카테고리의 다른 글
[안드로이드] RecyclerView란? (RecyclerView와 ListView 차이) (6) | 2016.07.11 |
---|---|
[안드로이드] 안드로이드 메모리 관리 (Weak Reference와 Soft Reference) (0) | 2016.07.08 |
[안드로이드] AsyncTask란? (개념 및 사용법) (3) | 2016.07.07 |
[안드로이드] Thread, Handler, Looper를 통한 백그라운드 처리 (10) | 2016.07.06 |
[안드로이드] 스레드(Thread) 개념 및 사용법 (5) | 2016.07.06 |
[안드로이드] ANR의 의미와 예방 (2) | 2016.07.05 |