runOnUiThread()

sumi Yoo·2022년 10월 29일
0
post-thumbnail

1. runOnUiThread() 란?

안드로이드에서 제공하는 Message나 Runnable 객체를 UI 스레드 쪽에서 사용하는 방법은 4가지가 있습니다.

  • Activity.runOnUiThread( )
  • Handler.post( )
  • View.post( )
  • AsyncTask

runOnUiThread와 Handler의 차이는 Handler는 post 방식을 통해 매번 이벤트를 발생시키지만, runOnUiThread는 현재 시점이 UI 스레드이면 바로 실행시켜서 좀 더 효율적이라고 할 수 있습니다.

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

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

2. 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();

View.post()

public boolean post(Runnable action) {
    final AttachInfo attachInfo = mAttachInfo;
    if (attachInfo != null) {
        return attachInfo.mHandler.post(action);
    }
    // Postpone the runnable until we know on which thread it needs to run.
    // Assume that the runnable will be successfully placed after attach.
    getRunQueue().post(action);
    return true;
}

Handler와 사용하는 인터페이스가 비슷하지만 가장 중요한 차이는 바로 attach가 됐는지 여부를 확인한다는 것이다. View가 attach, 즉 화면에 보여지는 시기에 맞춰서 실행하려면 View.post()를 사용해야한다.

다시 말하면 View.post()는 attach되지 않으면 post된 모든 runnable들의 실행이 attach 될 때 까지 연기(postpone)된다. 여기서 getRunQueue는 View에만 존재하는 pending된 Runnable들의 HandlerActionQueue이다.

이는 View와 관련한 미묘한 타이밍 이슈를 처리할 때, 유용하게 사용된다. View가 GONE되거나 detach된 경우 아무리 post를 호출해도 등록된 콜백들은 동작하지 않게된다. 이런 섬세한 처리부분은 Handler만 가지곤 불가능하다.

https://velog.io/@ilil1/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-runOnUiThread

0개의 댓글