android - LiveData 观察者的 Kotlin 语法?

标签 android kotlin

我的 HomeActivity 中有以下代码用于使用 LiveData

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? ->

    });

}

虽然这似乎可行,但以下部分是什么意思?

Observer { user: User? ->

}

这必须产生一个符合 Observer 接口(interface)的对象,该接口(interface)具有

void onChanged (T t)

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

如何

Observer { user: User? ->

}

产生一个带有 onChanged 方法的对象?

我不知道将接口(interface)名称放在 lambda 表达式前面是什么意思。

谢谢!

最佳答案

这称为 SAM 转换,这个概念有助于与 Java 单一抽象方法接口(interface)进行交互,就像您的示例中一样。

以下创建Runnable的实现,其中单个抽象方法是run():

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

文档中有描述:https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

另外一种更详细的方法是使用 object:

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

两者都是该接口(interface)的匿名实现示例。当然也可以创建一个具体的子类然后实例化它。

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

val runnable3 = MyRunnable()

关于android - LiveData 观察者的 Kotlin 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47604918/

相关文章:

android - TabPageIndicator 文本字体

android - WifiManager 返回 BSSID 00 :00:00:00:00:00

安卓编程 : How to draw multiline text in a rectangle?

android - Cordova - Android 更新(卡住版本)

kotlin - block 注释内引号中的结束标记

kotlin - 在 kotlin 1.3 中使用协程的正确方法

android - 使用 Android Camera2 API 进行人脸检测和画圈

使用不同服务类的 Spring Boot 测试

spring-boot - lateinit属性vkUserRepository尚未初始化。为什么?

kotlin - 如何创建一个内部类,其中只有外部类可以访问构造函数,而其余部分在任何地方都可见?