问题 LiveData观察者的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 界面有

void onChanged (T t)

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

如何

Observer { user: User? ->

}

导致一个带有的对象 onChanged 方法?

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

谢谢!


2225
2017-12-02 05:27


起源



答案:


这就是所谓的 SAM转换,一个有助于与Java交互的概念 单一抽象方法 接口类似于您的示例。

以下创建了一个实现 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()

11
2017-12-02 08:23



谢谢,s1m0nw1。编写明确定义onChanged方法的更冗长的编写方式是什么? - Ted Henry
当您实现接口时,正常的方式是类MyObserver:Observer {// method impl} - s1m0nw1
它似乎可以写成 this.viewModel.getUser().observe(this, object: Observer<User> { override fun onChanged(user: User?) { } }); - Ted Henry
这也是可能的。我添加了替代品 - s1m0nw1


答案:


这就是所谓的 SAM转换,一个有助于与Java交互的概念 单一抽象方法 接口类似于您的示例。

以下创建了一个实现 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()

11
2017-12-02 08:23



谢谢,s1m0nw1。编写明确定义onChanged方法的更冗长的编写方式是什么? - Ted Henry
当您实现接口时,正常的方式是类MyObserver:Observer {// method impl} - s1m0nw1
它似乎可以写成 this.viewModel.getUser().observe(this, object: Observer<User> { override fun onChanged(user: User?) { } }); - Ted Henry
这也是可能的。我添加了替代品 - s1m0nw1