티스토리 뷰

728x90
반응형

Handler ( sendMessage, post ) / runOnUiThread

  1. Handler ( sendMessage, post )

  2. runOnUiThread

  3. References

안드로이드에서 Thread 를 Main Thread 로 이관하는 작업 도중 문득 Handler ( sendMessage, post ) / runOnUiThread 의 차이점이 궁금해져서 찾아보았다.

각각의 사용법에 대해서는 잘 정리해놓은 글들이 많이 있고 내용이 길어질 수 있으니 사용법 관련해서는 적지 않았다.

Handler ( sendMessage, post )

sendMessage()

public final boolean sendMessage(Message msg)
{
return sendMessageDelayed(msg, 0);
}

Handler.java 내에 정의된 sendMessage() 메소드이다.

img

[ 출처 : https://itmining.tistory.com/5 ]

sendMessage() 는 알다시피 위와 같이 처리된다.

잠깐 딴 소리 좀 하자면

Message msg = new Message(); // 내가 주로 사용하던 방식
Message msg = handler.obtainMessage(); // 예제에서 찾은 방식

Message 객체 생성 시 나는 주로 1번 라인 방식으로 사용하였었는데

찾다보니 2번 라인의 방식으로 예제가 많이 나와있었다. 무엇이 다른가 하여 Android Devleopers 사이트에서 설명을 찾아보니

obtainMessage() 는 Global Message Pool 에서 새 Message 객체를 반환하며, 새 인스턴스를 생성하고 할당하는 것보다 효율적이라고 한다.

Message.obtain() vs Handler.obtainMessage()

Handler.obtainMessage() 는 자동으로 traget handler 가 호출하는 handler 로 정해지고

Message.obtain() 은 target handler 를 지정해주어야 한다.

둘다 메시지 풀에서 객체를 가져온다는데 ?? 이 내용은 따로 포스팅 해야겠다.

그렇다면 post 메소드의 내부는 어떨까 ?

post()

 public final boolean post(Runnable r)
{
return  sendMessageDelayed(getPostMessage(r), 0);
}

Handler.java 에 정의된 post() 이다.

sendMessage() 와 동일하게 sendMessageDelayed(Message, long) 를 호출하는 것을 볼 수 있다. Message 객체를 전달할 때 다른 것이 보이는데 getPostMessage() 를 살펴보자.

private static Message getPostMessage(Runnable r) 
{
Message m = Message.obtain();
m.callback = r;
return m;
}

Message.obtain() 으로 Message Pool 에서 메시지 객체를 가져오고

전달 받은 Runnable 객체를 콜백으로 등록한 뒤 해당 Message 객체를 리턴해준다.

그렇다면 sendMessage()post() 는 어떤 Message 객체를 쓰느냐의 차이가 있을 뿐, 내부적으로 동일하게 sendMessageDelayed(Message, long) 를 호출한다는 것을 알 수 있다.

runOnUiThread

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

Activity.java 내에 정의된 runOnUiThread() 메소드이다.

만약 현재 Thread 가 UI Thread 가 아니면, handler 의 post 를 실행하고

현재 Thread 가 UI Thread 라면, 전달받은 Runnable 작업을 실행, run() 시켜준다.

final Handler mHandler = new Handler();

Handler 는 위와 같이 전역 변수 final 로 관리되고 있고

mUiThread = Thread.currentThread(); // Thread mUiThread

mUiThread 는 Activity.attach() 에서 이처럼 초기화 된다.

결국 runOnUiThread 는 Handler.post() 로 동작한다는걸 알 수 있다.

References

https://sdw8001.tistory.com/119


반응형
공지사항
최근에 올라온 글