안드로이드에서 findViewById 함수가 성능이 떨어지나요?


안드로이드에서 findViewById() 가 성능이 떨어지나요?

내부적으로 어떤 알고리즘을 이용해 Id를 찾는지

그리고 왜 성능이 떨어지는지 궁금합니다ㅠㅠ

마지막으로 findViewById() 를 대체할 만한 함수는 어떤게 있을까요??


조회수 763


2 답변


좋아요
5
싫어요
채택취소하기

기술적으로 보자면 액티비티는 메인이 되는 데코레이터 뷰에게 findViewById를 호출하고요. 그 후로 뷰의 계층에 따라 반복적으로 findViewById가 호출이 됩니다.

View인 경우는 자기와 id가 같은지 확인합니다.

ViewGroup의 경우에는 자기와 id가 같은지 비교하고 같지 않은 경우에 자식들에 대해 하나씩 findViewById를 호출하는 형태로 됩니다.

개별 뷰는 자신만 확인하고 레이아웃을 담당하는 뷰는 자신과 자식을 확인하는 것이죠. 이 과정은 트리의 깊이 우선 탐색과 같습니다.

뷰의 깊이가 심하게 깊거나 자식이 많은 경우가 아니라면 findViewById가 호출되는 시간은 크게 염려할 수준은 아닙니다.

또 일반적으로 반복적으로 사용되는 findViewById의 경우에는 onCreate등에서 뷰를 찾아 액티비티나 프래그먼트 클래스의 속성으로 등록합니다.

mTextView = findViewById(R.id.testView);
...
mTextView.setText("Blah Blaah");

이런식으로 찾아둔 뷰를 담아두면 다시 질의할 필요가 없으니 좀 더 효과적입니다. 이렇게 찾아둔 뷰를 담아두는 과정을 수 작업으로 하는 것은 꽤 귀찮은 작업입니다. 그런 작업의 경우에는 어노테이션 프로세싱을 통해 자동화할 수 있습니다. 대표적인 라이브러리는 버터나이프가 있습니다.

뷰를 찾지 않고 데이터 바인딩을 이용해서 데이터와 뷰의 데이터를 동기화 시키는 방법도 있습니다. 해당 방법을 알고 싶으면 데이타바인딩을 참고하세요.

  • 2016년 03월 29일에 작성됨
    모바일 데이터 베이스를 만드는 yet another nit picker.


findViewById() 가 성능이 떨어지는 경우는 제 경험상 과거 ListView 의 렌더링 방식에 많은 퍼포먼스가 사용되었을 때 정도입니다. 지금은 RecyclerView 에 ViewHolder 패턴을 주로 사용하기에 findViewById()에 큰 퍼포먼스 비용이 들어가지 않습니다.

이 경우는 KMSHACK 님의 게시글 을 참고하시면 좋습니다

findViewById 의 내부 알고리즘은 잘 모르지만 R.java 에 대해서 검색해 보세요

findViewById 를 대체할 만한 거로는 코드를 줄이고 생산성을 높이기 위해 라이브러리로 개발된 Android Annotaion 또는 ButterKnife 등이 있습니다.

  • 2016년 03월 29일에 작성됨
    Java / Android 개발을 맡고있는 너드입니다

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close