Effizienz findViewById

Wahrscheinlich die meisten Android-Entwickler wissen, dass findViewById ist nicht Billig Betrieb. Eine andere Sache, dass die meisten von uns wissen, ist, dass Sie Sie können erhöhen Sie die Leistungsfähigkeit durch die Verwendung der kleinsten sub-Baum der view-Hierarchie zu finden, sichten durch Ihre id, Beispiel:

<LinearLayout
    android:id="@+id/some_id_0">
    <LinearLayout
        android:id="@+id/some_id_1">
        <LinearLayout
            android:id="@+id/some_id_2">
            <TextView android:id="@+id/textview" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

In diesem Fall möchten Sie wahrscheinlich die Suche im LinearLayout mit der id == @id/textview

Aber was ist der Fall, wenn die Hierarchie nicht Kaskadierung, sondern Verzweigungen auf jeder Ebene, und Sie möchten den Blick auf die "Blätter" lassen Sie uns sagen? Führen Sie die findViewById man die Unterseite der Zweig, durch das finden Eltern, ODER führen Sie die findViewById auf eine größere Teilmenge? Ich denke, eine einfache Antwort wäre, dass es hängt von der Fall, aber vielleicht könnten wir verallgemeinern ein bisschen auf was es wirklich hängt?

Dank

EDIT:

Durch eine größere Teilmenge meine ich so etwas wie dieses:

<RelativeLayout android:id="@+id/r0">    
    <RelativeLayout
        android:id="@+id/r1">
        <LinearLayout
            android:id="@+id/some_id_0">
            <LinearLayout
                android:id="@+id/some_id_1">
                <LinearLayout
                    android:id="@+id/some_id_2">
                    <TextView android:id="@+id/textview0" />
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:id="@+id/some_id_3">
            <LinearLayout
                android:id="@+id/some_id_4">
                <LinearLayout
                    android:id="@+id/some_id_5">
                    <TextView android:id="@+id/textview1" />
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>
    <LinearLayout
        android:id="@+id/some_id_6">
        <LinearLayout
            android:id="@+id/some_id_7">
            <LinearLayout
                android:id="@+id/some_id_8">
                <TextView android:id="@+id/textview2" />
                <TextView android:id="@+id/textview3" />
                <TextView android:id="@+id/textview4" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

So wäre die Frage, wenn ich will findViewById die TextView Blick in LinearLayout mit @+id/some_id_8 sollte ich ausführen dieses Vorgangs auf die ganze Packung, oder sollte ich findViewById die LinearLayout mit @+id/some_id_8 und auf diese Ansicht findViewById alle TextViews?

  • Können Sie erklären, mehr Ihr 2 alternativen, vor allem die "findViewById auf eine größere Untermenge" ?
  • Überprüfen Sie bitte mein edit.
  • Standard-traversal ist Tiefe ersten. Das finden einer Teilstruktur erste riecht wie Mikro-Optimierung, das macht den code etwas schwieriger zu pflegen. Messen, um herauszufinden, ob es wirklich einen Unterschied macht
  • Als laalto bereits erwähnt findViewById() iteriert über den gesamten view-Hierarchie, so dass mit den beiden findViewById () - Aufrufe wird keinen Unterschied machen(außer Sie haben eine zusätzliche Zeile code). Wenn Sie eine intime Kenntnis über die view-Hierarchie könntest du eine Kombination von getChild() und findViewById (), die sollte schneller sein in einigen casses(nicht, dass es egal), aber werde den code sehr starr, um zukünftige änderungen. In das Ende, das die Tiefe und die Größe der view-Hierarchie werden wichtiger für die performance dann suchen diese Ansichten.
InformationsquelleAutor overbet13 | 2014-09-25
Schreibe einen Kommentar