안드로이드에서 findViewById 함수가 성능이 떨어지나요?
조회수 4485회
안드로이드에서 findViewById() 가 성능이 떨어지나요?
내부적으로 어떤 알고리즘을 이용해 Id를 찾는지
그리고 왜 성능이 떨어지는지 궁금합니다ㅠㅠ
마지막으로 findViewById() 를 대체할 만한 함수는 어떤게 있을까요??
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
기술적으로 보자면 액티비티는 메인이 되는 데코레이터 뷰에게
findViewById
를 호출하고요. 그 후로 뷰의 계층에 따라 반복적으로findViewById
가 호출이 됩니다.View
인 경우는 자기와 id가 같은지 확인합니다.ViewGroup
의 경우에는 자기와 id가 같은지 비교하고 같지 않은 경우에 자식들에 대해 하나씩findViewById
를 호출하는 형태로 됩니다.개별 뷰는 자신만 확인하고 레이아웃을 담당하는 뷰는 자신과 자식을 확인하는 것이죠. 이 과정은 트리의 깊이 우선 탐색과 같습니다.
뷰의 깊이가 심하게 깊거나 자식이 많은 경우가 아니라면
findViewById
가 호출되는 시간은 크게 염려할 수준은 아닙니다.또 일반적으로 반복적으로 사용되는
findViewById
의 경우에는onCreate
등에서 뷰를 찾아 액티비티나 프래그먼트 클래스의 속성으로 등록합니다.mTextView = findViewById(R.id.testView); ... mTextView.setText("Blah Blaah");
이런식으로 찾아둔 뷰를 담아두면 다시 질의할 필요가 없으니 좀 더 효과적입니다. 이렇게 찾아둔 뷰를 담아두는 과정을 수 작업으로 하는 것은 꽤 귀찮은 작업입니다. 그런 작업의 경우에는 어노테이션 프로세싱을 통해 자동화할 수 있습니다. 대표적인 라이브러리는 버터나이프가 있습니다.
뷰를 찾지 않고 데이터 바인딩을 이용해서 데이터와 뷰의 데이터를 동기화 시키는 방법도 있습니다. 해당 방법을 알고 싶으면 데이타바인딩을 참고하세요.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력