2017-12-02 25 views
0

Ich habe das folgende Bit Code in meinem HomeActivity zu verwenden LiveData.Kotlin Syntax für LiveData Beobachter?

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 

    // Show the launch splash screen. 
    // 
    this.setContentView(R.layout.activity_home) 

    this.viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java) 

    this.viewModel.getUser().observe(this, Observer { user: User? -> 

    }); 

} 

Während dies zu funktionieren scheint, was bedeutet der folgende Teil?

Observer { user: User? -> 

} 

Dies muss in einem Objekt entstanden sind, zu der Observer Schnittstelle entspricht, die

void onChanged (T t) 

https://developer.android.com/reference/android/arch/lifecycle/Observer.html

hat Wie funktioniert

Observer { user: User? -> 

} 

Ergebnis in einem Objekt mit einem onChanged Verfahren ?

Ich weiß nicht, was bedeutet, den Namen einer Schnittstelle vor einem Lambda-Ausdruck bedeutet.

Danke!

Antwort

2

Dies wird SAM Conversion, ein Konzept namens, die mit Java Einzel abstrakte Methode Schnittstellen wie in Ihrem Beispiel hilft interagieren.

Die folgende schafft eine Implementierung von Runnable, wo die einzige abstrakte Methode ist run():

val runnable = Runnable { println("This runs in a runnable") } 

Es ist in der Dokumentation beschrieben ist: https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

Alternativ, aber ausführlicher, wäre eine object zu verwenden :

val runnable2 = object : Runnable { 
     override fun run() { 
      println("This runs in a runnable") 
     } 
} 

Beide sind Beispiele für anonyme Implementierung Entsprechungen davon interface. Es ist natürlich auch möglich, eine konkrete Unterklasse zu erstellen und sie dann zu instanziieren.

class MyRunnable : Runnable { 
    override fun run() { 
     println("This runs in a runnable") 
    } 
} 

val runnable3 = MyRunnable() 
+0

Vielen Dank, s1m0nw1. Was wäre die ausführlichere Schreibweise, die die onChanged-Methode explizit definiert? –

+0

Wenn Sie die Schnittstelle die normale Art und Weise Wie Klasse MyObserver implementieren: Observer {// Methode impl} – s1m0nw1

+0

Es scheint, kann es als 'this.viewModel.getUser() geschrieben werden beobachten (this, Objekt:. Observer { Überschreibung fun onChanged (Benutzer: Benutzer?) { } }); ' –