2017-07-21 3 views
7

Wenn ich eine einfache benutzerdefinierte Ansicht:Machen die Android-Erweiterungen von Kotlin die synthetischen Eigenschaften zwischenspeichern oder jedes Mal, wenn sie findViewById() aufrufen?

myitem.xml

<FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     > 

     <TextView 
     android:id="@+id/textview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 
<FrameLayout/> 

eine kotlinx syntentic Eigenschaft Zugriff:

import kotlinx.android.synthetic.main.myitem.view.* 

view.toolbar.text = "Some text" 

Intern es einen Aufruf an findByViewID() erzeugt. Also meine Frage lautet:

Ist das Ergebnis zwischengespeichert für benutzerdefinierte Ansichten wie für Aktivitäten oder jedes Mal findByViewID heißt? Die Antwort ist aus Performance-Gründen ziemlich wichtig.

Antwort

3

Seit 1.1.4 können Ansichten in jeder Klasse zwischengespeichert werden. Caching in benutzerdefinierten Ansichten standardmäßig aktiviert. Für ViewHolders benötigen Sie LayoutContainer Schnittstelle wie folgt umzusetzen: class MyViewHolder(override val containerView: View): LayoutContainer

dieses doc Siehe Details https://github.com/Kotlin/KEEP/blob/master/proposals/android-extensions-entity-caching.md

Update: zu können LayoutContainer verwenden Sie das dem gradle Skript hinzufügen sollte: androidExtensions { experimental = true }

+0

Wird der Vorschlag in 1.1.4 vollständig umgesetzt? – WindRider

+1

ja. Lesen Sie die 1.1.4 Release Notes – deviant

+0

Ich tat, aber ich war mir nicht ganz sicher. – WindRider

7

In der aktuellen Version (1.1.3) werden Ansichten für Layouts von Aktivitäten und Fragmenten zwischengespeichert. Für andere Arten von Containern wie RecyclerView ViewHolders gibt es keinen Cache.

Auch der Cache ist ein HashMap mit Integer Boxen für Schlüssel. A SparseArray wäre besser gewesen.

Bearbeiten: Seit Version 1.1.4 können Ansichten auch für andere Klassen zwischengespeichert werden, einschließlich ViewHolder, wenn Sie sie die LayoutContainer Schnittstelle implementieren implementieren. Sie können auch die Annotation @ContainerOptions verwenden, um eine andere Cache-Implementierung anzugeben, einschließlich SparseArray. Beide Funktionen sind noch experimentell und müssen manuell in Ihrer build.gradle Datei aktiviert werden:

androidExtensions { 
    experimental = true 
} 

Read more darüber.

Verwandte Themen