invalidate란?
- ViewGroup에게 자신의 영역을 다시 그려야 한다는 의미를 갖는 함수
1. invalidate 메서드의 호출스택
- ViewGroup의 invalidateChild를 호출
- invalidateChild에서는 invalidateChildInParent를 호출
- invalidateChildInParent는 parent가 null일 때까지 while문으로 실행된다.
- 현재 루트가 아닐때 ViewGroup의 invalidateChildInParent 호출
- 현재 루트일때 ViewRootImpl의 invalidateChildInParent 호출
- 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 클래스 안에는
가 존재 하는데 invalidate가 여러번 호출 될때 이 플래그에 걸려서 한번만 호출되게 되는 것이다.mPrivateFlags
댓글