当前位置: 首页 > 面试题库 >

LiveData观察者的Kotlin语法?

寿丰
2023-03-14
问题内容

我有以下代码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表达式前面意味着什么。

谢谢!


问题答案:

这称为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()


 类似资料:
  • 在livedata的observe方法中有这样一条评论 在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上分派。如果LiveData已经有数据集,它将传递给观察者。 当我尝试向现有livedata实例添加新的观察者时,如果livedata具有数据集,则new观察者的onChanged方法调用。 有什么办法可以避免这种行为吗?我只是不想被通知新的观察员 SingleLiveEv

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我之所以说怪异,是因为我不明白有人可能会告诉我什么在按预期工作。 我有一个带有LiveData成员的Android ViewModel,我在Main活动中观察到它来切换一些代码功能。LiveData对象在视图模型的构造函数中被分配初始值。 从理论上讲,一切都很好,只是在安装后第一次启动应用程序和随后启动应用程序之间,观察者的行为会发生变化。 在安装后的第一次启动期间,在我设置好观察者之后,它们会立

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我有一个视图模型,从场景中接收流作为livedata 在活动中,我们订阅了这个livedata,一些逻辑发生并使用了activityResult 当我们返回时,我们会用最后一个状态触发一个观察者,并再次执行之前的导航逻辑 如何忽略返回时具有相同值的观察者触发器?