Handler(Looper.getMainLooper())
- 메인쓰레드와 다른쓰레드를 handler를 이용하여 연결해주는 방법
Activity.runOnUiThread(Runnable)
- 현재 쓰레드가 메인쓰레드이면 바로 작업 실행, 현재 쓰레드가 메인쓰레드가 아니라면 메인쓰레드 message Queue에 작업 할당.
@Override
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
View.post(Runnable)
- runOnUiThread와 비슷하지만, view가 attach 되었는지 체크한다는 차이점이 있음.
- view가 attach 되었다면, 작업을 메인쓰레드 message Queue에 할당.
- view가 아직 attach 되지 않았다면, RunQueue-지연된 작업들이 모여있는 queue이며 view에만 존재한다.-에 작업을 할당.
- public boolean postDelayed (Runnable action, long delayMillis) 을 이용해서 시간 경과 후 작업을 시작하도록 할 수도 있음.
- view가 Gone , detach 된 후에는 post를 불러도 함수가 작동되지 않음.
public boolean post(Runnable action) {
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
getRunQueue().post(action);
return true;
}
- 뷰A의 matchParent 일 때 width 길이를 기준으로 다른 뷰들의 width 길이를 변경하고 싶었는데,
이때 view.post 를 사용하였습니다.
- 그냥 binding.textView.getWidth()를 하면 항상 0 이 나옵니다.
- 하지만 post 함수는 뷰A가 attach 된 이후에 작동하는 함수이기 때문에, matchParent width 길이를 정확히 잘 가져 올 수 있습니다.
binding.textView.post {
matchParentWidth = binding.textView.width
}
참고블로그