2010-12-09 6 views
-1

Es wurde ein Leistungsproblem festgestellt, wenn viele verschachtelte RelativeLayouts verwendet wurden.
Komplexe RelativeLayout-basierte Ansicht - Leistungsproblem

Zum Beispiel, wenn wir einige RelativeLayout als UI-Wurzel, und jeden Behälter (Buttons, Labels, Textview, Imageview) ist eine RelativeLayout + Android-basierte Komponente (ex. AButton = RelativeLayout + Imageview + Textview), dann in eine komplexe Ansicht von 4 Buttons, 3 Bildern und 6 Labels erhalten wir ~ 15 verschachtelte RelativeLayouts.

RelativeLayout hat eine sehr komplexe onMeasure-Methode, die die Größe jedes untergeordneten Elements berechnet, um die Größe des Layouts zu bestimmen. Die Berechnung der Größe einer komplexen Ansicht von 15-20 verschachtelten RelativeLayouts kostet ~ 5 Sekunden, das ist zu viel. onMeasure ist der teuerste aller Anrufe, sogar das Zeichnen ist viel schneller abgeschlossen als die Messung. < = UPD =>
Um zu verhindern, dass Vorschläge erscheinen, native Android-Ansichten zu verwenden, um etwas Komplexes zu erstellen:
Fähigkeit, alles zu allem hinzuzufügen, ist erforderlich. Deshalb muss jeder Container nicht nur View, sondern ViewGroup sein. Und RelativeLayout-Funktionen wie Schwerkraft und Ausrichtung können ebenfalls sehr hilfreich sein, weshalb viele RelativeLayouts verwendet werden. < =/UPD =>

Hatte jemand diese Leistungsprobleme?
Sollte RelativeLayout durch ein anderes Layout-Problem ersetzt werden?
Oder das Entfernen all dieser verschachtelten Layouts ist die einzige Möglichkeit, mit dem Problem umzugehen?
Weiß jemand, wie viele Layouts verschachtelt werden können, ohne dass Leistungsprobleme auftreten?

+0

Wie haben Sie diese Verzögerung gemessen? –

+0

Verwenden von Debugmethoden und integriertem TraceView-Dienstprogramm. Sie können weitere Details hier erhalten http://stackoverflow.com/questions/1957135/how-do-test-the-performance-of-andandroid-application – AAverin

Antwort

0

Nach ein paar Tests kam zu dem Schluss, dass mehr als 12 verschachtelte Layouts einen großen Einfluss auf die Leistung hat.
Im Durchschnitt 10-11 verschachtelte Layouts sollten gut funktionieren.
Zum Beispiel 12 verschachtelte Layouts mit 12 Kindern auf jedem Display in 6 Sekunden auf dem Gerät und in 9 auf dem Emulator.

2

Es hängt definitiv von Ihrem Testgerät ab. Aber Sie sollten die hierarchyviewer (im Tools-Verzeichnis) für unnötige Nester von Sichten überprüfen, um sie zu entfernen.

Auch Ihr aButton klingt wie eine Aktie ImageButton. So könnte man zumindest das durch eine Standardlösung ersetzen.

Wenn Sie einen Code geschrieben haben, ist es möglicherweise einfacher festzustellen, ob es mehr Artikel gibt, die durch eine Bestandslösung ersetzt werden könnten.

+0

Misstiped meine aButton-Version. aButton = RelativeLayout + ImageButton + TextView (für Label-Unterstützung). Ich habe HierarchyViewer überprüft, alles scheint gut zu sein. Natürlich kann ich einige Layouts loswerden, aber es erhöht nicht die durchschnittliche Leistung. Statt 6 Sekunden vor der Anzeige bekomme ich ~ 4. Immer noch zu viel – AAverin

+0

Ok, du könntest also einen einfachen Button mit dem 'android: background =" @ color/transparent "' -Tag verwenden, um den Button transparent zu machen und dann 'android: drawableTop =" @ drawable/some_drawable "' für ein Bild in der Schaltfläche selbst zeichnen. – keyboardsurfer

+0

Ja, das ist eine Lösung, um den Knopf zu vereinfachen.Ich kann auch meine eigene Klasse someButton extended ImageButton erstellen und label in der Methode onDraw() zeichnen, ohne TextView zu verwenden. In diesem Fall wird RelativeLayout auch nicht mehr benötigt. Aber zuerst möchte ich sicher sein, dass die Verwendung von N verschachtelten RelativeLayouts aus irgendeinem Grund falsch ist. Danach beginne ich, Komponenten zu vereinfachen und die UI-Architektur meiner App neu zu schreiben. – AAverin

0

Es war mein Verständnis, dass der ganze Punkt des relativen Layouts ist, dass Sie sie nicht zum n-ten Grad verschachteln müssen. Warum nicht einfach ein paar RelativeLayouts anstelle von 1 pro Komponente verwenden?