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

조회수 4393회

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

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

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

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

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

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

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

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

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

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

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

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

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

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

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)