본문 바로가기
기타/안드로이드 NextStep

[안드로이드 NextStep] 2.5 UI변경 메커니즘

by 창이2 2022. 1. 31.

invalidate란?

  • ViewGroup에게 자신의 영역을 다시 그려야 한다는 의미를 갖는 함수

 

 

1. invalidate 메서드의 호출스택

  1. ViewGroup의 invalidateChild를 호출
  2. invalidateChild에서는 invalidateChildInParent를 호출
  3. invalidateChildInParent는 parent가 null일 때까지 while문으로 실행된다.
    • 현재 루트가 아닐때 ViewGroup의 invalidateChildInParent 호출
    • 현재 루트일때 ViewRootImpl의 invalidateChildInParent 호출
  4. ViewRootImpl의 invalidateChildInParent에서 traversal 함수 호출
    • traversal 함수는 invalidate 영역을 다시 그리기 위해 순회 작업하는 함수
    •  

2. invalidate가 여러번 호출 된다면?

  • 아래와 같이 텍스트 뷰를 클릭했을때 Count 0 으로 바뀌고 1초 후에 1로 바뀌고 ... 이렇게 생각이 들것이다.         
            binding.textView.setOnClickListener {
                for(i in 0..4){
                    binding.textView.setText("Count : ${i}")
                    SystemClock.sleep(1000)
                }
            }​
  • 그러나 실제 결과는 한번 클릭 후 5초 후에 4로 한번만 바뀌게 된다. View 클래스 안에는
    mPrivateFlags​
    가 존재 하는데 invalidate가 여러번 호출 될때 이 플래그에 걸려서 한번만 호출되게 되는 것이다. 

 

댓글