티스토리 뷰
Handler ( sendMessage, post )
runOnUiThread
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()
메소드이다.
[ 출처 : 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
'프로그래밍 > Android' 카테고리의 다른 글
[Android] Architecture Components 사용 시의 5가지 일반적인 실수 (0) | 2019.10.20 |
---|---|
[Android] Message.obtain() vs Handler.obtainMessage() (0) | 2019.10.03 |
[Android] 인터페이스 상수 (0) | 2019.08.25 |
[Android] JNI (0) | 2019.08.25 |
[Android] App is not indexable by Google Search (0) | 2019.03.13 |