공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,191,227명의 방문자 수를 기록하고 있습니다.
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
post() gets called after setContentView().

Method setContentView() ends up in calling ViewGroup.addView() of the top view, and addView() call always triggers requestLayout().

In turn, requestLayout() posts a task to the main thread to be executed later.

This task will execute measure and layout on the view hierarchy.

Now if you post another task it will be put into the queue after layout task and, as the result, always executed after measure and layout happen. Thus you will always have valid sizes.

parentView.post(new Runnable() {
  // Post in the parent's message queue to make sure the parent
  // lays out its children before you call getHitRect()
  public void run() {
  /// do UI stuff


Post runnable은 setContentView가 호출되고 나서야 불린다.

즉, setContentView는 상위 뷰의 addView의 호출로 끝이나며 addView는 항상 requestLayout을 호출하게 된다.


그리고나서 requestLayout은 나중에 실행될 메인 스레드에 task를 post한다.


만약 다른 task를 post한다면 layout task 이후로 queue에 쌓이게 되고 결과적으로 항상 measure와 layout가 일어난 후에 실행된다.


따라서 항상 post이후에는 valid한 size를 얻을 수 있는 것이다.





Does posting Runnable to an UI thread guarantee that layout is finished when it is run?

First thing! I do know about ViewTreeObserver.onGlobalLayoutListener. What made me ask this question is the following notice on Android developer documentation website: The snippet below does the