带LiveData的ViewModel与不带LiveData的ViewModel有何区别?

时间:2019-02-23 12:26:36

标签: android mvvm viewmodel android-livedata

我阅读了许多有关viewmodel和livedata的教程,但是我没有真正在mvvm模式的viewmodel类中使用livedata。提前致谢。

3 个答案:

答案 0 :(得分:0)

MVVM模式是只讲V-> VM-> M并作出反应M-> VM->V。这意味着View可以调用ViewModel上的方法,但是ViewModel没有对View的引用调用其上的方法(设置数据)。从ViewModel到View的通信方式是通过View观察一些变量(ObservableField,LiveData,RxJava等)。

LiveData是一个很好的可观察对象,可提供viewModel和View之间的通信,尤其是在状态变化(例如旋转)时。在数据库更改和Room方面,它还提供了Model与View之间的良好沟通。

答案 1 :(得分:0)

根据Google文档,如果您已经在使用Rx或Agera之类的库,则可以继续使用它们代替LiveData。但是在这种情况下,您有责任按照Android组件生命周期来处理对象分配和取消分配。

在使用MVVM模式时,由于viewmodel没有对视图的引用,因此需要可观察的数据持有者来观察更改,以便可以正确更新视图。

在这种情况下,您可以使用实时数据,体系结构组件之一或任何其他可从Rx中观察到的数据。

主要区别是livedata尊重android生命周期,而rx observables不尊重。

使用livedata时,不会发生由于onChange调用而停止活动的崩溃,因为它是生命周期感知的。 但是,如果没有livedata,则取决于您来处理这种情况。

答案 2 :(得分:0)

Android开发人员通常使用ViewModel这样的LiveData容器

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

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

class MyViewModel {
    val myString = "Hello"
}

因为我们要对字符串使用Observer模式。

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之间的区别。

  

带LiveData的ViewModel与没有LiveData的ViewModel有何区别?

由您决定,您是否需要在ViewModel上使用LiveData?

  

我没有在mvvm模式中的viewmodel类中实际使用livedata。

了解了ViewModel和LiveData的区别之后,请阅读有关MVVM模式的更多信息。

模型-视图-视图-模型中的视图模型与Jetpack的ViewModel和LiveData不同。 MVVM中的视图模型是一个概念,您可以使用常规Java类创建自己的视图模型。只要符合MVVM行为即可。