2010-12-09 3 views
-1

많은 중첩 된 RelativeLayouts 사용시 성능 문제가 발생했습니다.
예를 들어복잡한 RelativeLayout 기반 뷰 성능 문제

우리는 UI의 루트로 일부 RelativeLayout의, 모든 컨테이너 (버튼, 라벨, 텍스트 뷰, 이미지 뷰)가있는 경우는에 나서, RelativeLayout의 + 안드로이드 기반 구성 요소 (예. 인 aButton = RelativeLayout의 + 이미지 뷰 + 텍스트 뷰)입니다 4 개의 단추, 3 개의 이미지 및 6 개의 레이블의 복잡한보기 - ~ 15 개의 중첩 된 RelativeLayouts.

RelativeLayout에는 모든 자식의 크기를 계산하여 레이아웃 크기를 결정하는 매우 복잡한 onMeasure 메서드가 있습니다. 15 ~ 20 개의 중첩 된 RelativeLayouts의 복잡한보기 크기를 계산하는 데 ~ 5 초가 걸리므로 너무 많습니다. onMeasure는 모든 호출 중에서 가장 비싸며 그리기도 훨씬 빨라 측정이 완료됩니다. < = UPD =>
네이티브 Android보기를 사용하여 복잡한 항목을 만드는 제안을 방지하려면 다음을 수행하십시오.
모든 것을 모든 것에 추가 할 수있는 기능이 필요합니다. 이것이 모든 컨테이너가 View뿐 아니라 ViewGroup이되어야하는 이유입니다. 중력 및 정렬과 같은 RelativeLayout 기능을 사용하면 많은 도움이 될 수 있습니다. 그 때문에 많은 RelativeLayouts가 사용됩니다. < =/UPD =>

누구든지 이러한 성능 문제가 있습니까?
RelativeLayout을 다른 레이아웃으로 대체해야할까요?
이러한 중첩 된 레이아웃을 모두 제거하면 문제를 해결할 수있는 유일한 방법입니까?
일부 성능 문제가 나타나지 않고 얼마나 많은 레이아웃을 중첩시킬 수 있는지 알고있는 사람 있습니까?

+0

어떻게 지연을 측정 했습니까? –

+0

디버그 방법 및 내장 traceview 유틸리티 사용. 자세한 내용은 여기를 참조하십시오. http://stackoverflow.com/questions/1957135/how-do-test-the-performance-of-an-android-application – AAverin

답변

0

12 개 이상의 중첩 된 레이아웃을 사용하면 성능에 큰 영향을 미칩니다.
평균적으로 10-11 개의 중첩 레이아웃이 정상적으로 작동해야합니다.
예를 들어 장치 당 6 초 동안 각 디스플레이에 12 개의 자식이있는 12 개의 중첩 된 레이아웃과 에뮬레이터의 9 개에 있습니다.

2

확실히 테스트 장치에 따라 다릅니다. 그러나 도구 디렉토리에있는 hierarchyviewer에서보기의 불필요한 중첩이 있는지 확인하여 제거해야합니다.

또한 aButton은 ImageButton과 같은 소리가 들립니다. 따라서 최소한 표준 솔루션으로 대체 할 수 있습니다.

일부 코드를 게시 한 경우 스톡 솔루션으로 대체 할 수있는 항목이 더 있는지 여부를 쉽게 알 수 있습니다.

+0

내 aButton 버전을 잘못 입력했습니다. aButton = RelativeLayout + ImageButton + TextView (레이블 지원 용). 나는 HierarchyViewer를 체크했는데 모든 것이 잘 보입니다. 물론 레이아웃을 없앨 수는 있지만 평균 퍼포먼스가 증가하지는 않습니다. 보기가 나타납니다 전에 6 초 대신 ~ 4가 나타납니다. 여전히 너무 많습니다. – AAverin

+0

좋아요, 버튼 자체를 투명하게 만들기 위해'android : background = "@ color/transparent"태그로 간단한 버튼을 사용할 수 있습니다. 그리고 android : drawableTop = "@ drawable/some_drawable"'for 버튼 자체에 이미지를 그립니다. – keyboardsurfer

+0

네, 단순화 버튼입니다.내 자신의 클래스 someButton 확장 ImageButton을 만들고 TextView를 사용하지 않고 onDraw() 메서드에서 레이블을 그릴 수 있습니다. 이 경우 RelativeLayout도 더 이상 필요하지 않습니다. 하지만 먼저 N 개의 중첩 된 RelativeLayouts를 사용하는 것이 어떤 이유로 잘못되었는지 확인하고 싶습니다. 그런 다음 구성 요소를 단순화하고 내 앱의 UI 아키텍처를 다시 작성하기 시작합니다. – AAverin

0

relativelayout의 전체적인 점은 n 번째 학위에 중첩 할 필요가 없다는 것입니다. 왜 컴포넌트 당 1 개가 아닌 몇 개의 RelativeLayout을 사용하지 않는 것이 좋을까요?