2017-06-28 4 views
3

Bevor Kotlin, sollte Android-Entwickler Verweis auf die wie diese Ansichten in einem Variablen Aktivitäten speichern:Kotlin Android Erweiterungen und Variablen

Button fooBtn = (Button) findViewById(R.id.btn_foo) 

die Höhe des Kesselblech Code und die Anzahl der findViewById Anrufe zu reduzieren .

Mit der Einführung der Kotlin's Android Extensions wir die gleiche Taste, indem einfach verweisen können:

btn_foo 

Fragen:

  1. Hat die btn_foo hat einen Verweis auf die Taste gespeichert oder ruft es jedes Mal findViewById an?
  2. Denken Entwickler noch, Variablen zu verwenden, um btn_foo zu speichern, um die Leistung der Anwendung zu verbessern, oder einfach direkt im Code zu verwenden?

Edit: es an explanation ist, wie Erweiterungen arbeiten, aber es ist immer noch ein wenig unklar.

Antwort

4

Einer der Kotlin Android Extension (KAE) Entwickler Ihor Kucherenko bestätigt, dass:

  • KAE einen Verweis auf die Ansicht nach dem ersten Anruf halten, statt von findViewById die ganze Zeit zu verwenden. Das funktioniert nur für Activities und Fragments.

  • KAE speichert keine Daten und verwendet jedes Mal findViewById für ein anderes Element (außer für Activity/Fragment).

    class FooViewHolder(view: View): RecyclerView.ViewHolder(view) { 
        fun bind(day: FooItem.Day) { 
         btn_foo.text = day.title 
        } 
    } 
    

    Decompile in Java Aufruf aussehen wird:

    ((Button)this.itemView.findViewById(R.id.btn_foo)).setText((CharSequence)day.getTitle()); 
    

    das ist genau das, was Sie vermeiden wollen

Sollten Sie also ein ViewHolder init werden.

Die Entwickler könnten sich dessen bewusst sein.


Fazit: Füllen frei KAE ohne zusätzliche Variablen zu verwenden, aber nur für Ihre Activitiies/Fragments.

+1

Warum nur auf "Aktivitäten" und "Fragmente" beschränkt? Weil sie einen einfachen Zugang zu "Context" haben? – Tuby

+1

@Tuby könnte es mit dem 'Kontext' und der Art und Weise zusammenhängen, wie Kotlin Erweiterungsfunktionen erstellt (https://kotlinlang.org/docs/tutorials/android-plugin.html#under-the-hood). Es gibt eine GitHub PR, die das Problem anspricht und es für die Verwendung von KAE für Elemente wie einen 'ViewHolder' (https://github.com/Kotlin/KEEP/pull/33) verfügbar macht. Es ist jedoch seit einem Jahr inaktiv. – Oleg

+0

Mit der richtigen Verwendung der Google Data Binding-Bibliothek und des MVVM-Musters ist auch kein 'findViewById' erforderlich. Ich warte persönlich darauf, dass die Architekturkomponenten stabil werden, und implementiert Datenbindungen. Danach werde ich mein Projekt verschieben, um es zu verwenden. – Oleg

5

Es ist im Cache, so findViewById wird nicht jedes Mal aufgerufen, wenn Sie es brauchen. die Variable Speicherung wird nicht auf jeden Fall die Leistung der App verbessern