ViewModel与LiveData的区别是什么?与没有LiveData的ViewModel相比,有何不同?

6

我阅读了许多与ViewModel和LiveData相关的教程,但是我不太明白在MVVM模式中如何在ViewModel类中使用LiveData。提前感谢您的帮助。


1
如果你需要观察一个对象的状态,那么你需要使用LiveData。我想没有什么区别,这只是关于需求和最佳实践的问题。 - ADM
4个回答

8

Android开发常使用ViewModel作为LiveData的容器,例如:

class MyViewModel {
    val myLiveData = MutableLiveData<String>()
}

但是,为什么我们不直接使用String类呢?

class MyViewModel {
    val myString = "Hello"
}

因为我们想要将观察者模式应用到字符串中。

model.myLiveData.postValue("Echo")

model.myLiveData.observe(this, Observer {
    // Show "Echo"
    toast(it)
})

为什么我们需要ViewModel呢?因为我们希望在Activity或Fragment上获得相同的ViewModel实例(单例)。
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel = ViewModelProviders.of(this)[MyViewModel::class.java]
    viewModel.myLiveData.observe(this, Observer {
        textView.text = it
    })

我认为这已经足够让您开始看到ViewModel和LiveData之间的区别了。

ViewModel与带有LiveData和不带有LiveData的ViewModel之间有什么区别?

这取决于你,你是否需要在ViewModel中使用LiveData。

我实际上不理解在MVVM模式下ViewModel类中使用livedata的用途。

了解了ViewModel和LiveData之间的差异后,请继续阅读有关MVVM模式的更多信息。

MVVM中的View Model与Jetpack的ViewModel和LiveData不同。 MVVM中的View Model是一个概念,您可以使用普通Java类创建自己的View Model。只要它符合MVVM的行为即可。


5
根据Google Docs的说法,如果您已经在使用Rx或Agera这样的库,则可以继续使用它们而不是LiveData。但在这种情况下,您需要负责处理Android组件生命周期的对象分配和释放。
当使用MVVM模式时,由于viewmodel没有对视图的引用,您需要可观察的数据持有者来观察更改,以便可以正确地更新视图。
在这种情况下,您可以使用livedata,这是一种架构组件或任何其他可观察对象,例如Rx。 主要区别在于LiveData尊重Android生命周期,而Rx Observables则不尊重。 使用LiveData时,在onChange调用时不会因为停止的Activity而崩溃,因为它具有生命周期感知性。但是,如果没有LiveData,则由您来处理这种情况。

2
MVVM模式的作用是只在V -> VM -> M之间进行通信,并在M -> VM -> V之间进行反应。这意味着View可以调用ViewModel中的方法,但ViewModel没有引用View来调用其上的方法(设置数据)。从ViewModel到View进行通信的方式是通过View观察某些变量(ObservableField、LiveData、RxJava等)。
LiveData是一个很好的可观察对象,特别是在状态更改(如旋转)方面,它提供了viewModel和View之间的通信。它还提供了Model和View之间关于数据库更改和Room的良好通信。

0

简单来说,livedata 是一个神奇的可观察数据持有类,它还具有生命周期感知功能。

如果你在 viewmodel 中使用 livedata

  1. 你可以向 livedatasetValuepostValue 任何内容,你的 UI 将能够观察到该值及其变化并在 UI 中显示。
  2. 你可以使用 dataBinding 更好地观察 livedata
  3. 不需要手动配置即可实现内存泄漏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接