【发布时间】:2019-07-17 09:41:42
【问题描述】:
我阅读了许多关于 viewmodel 和 livedata 的教程,但我并没有在 mvvm 模式的 viewmodel 类中实际使用 livedata。提前致谢。
【问题讨论】:
-
如果你需要观察一个对象的状态,那么你需要
LiveData。没有区别,我猜这都是关于要求和最佳实践的......
标签: android mvvm viewmodel android-livedata
我阅读了许多关于 viewmodel 和 livedata 的教程,但我并没有在 mvvm 模式的 viewmodel 类中实际使用 livedata。提前致谢。
【问题讨论】:
LiveData。没有区别,我猜这都是关于要求和最佳实践的......
标签: android mvvm viewmodel android-livedata
根据 Google Docs,如果您已经在使用 Rx 或 Agera 等库,则可以继续使用它们而不是 LiveData。但在这种情况下,您有责任在每个 Android 组件生命周期中处理对象分配和解除分配。
在使用 MVVM 模式时,由于 viewmodel 没有对视图的引用,因此您需要可观察的数据持有者来观察更改,以便正确更新您的视图。
在这种情况下,您可以使用 livedata、架构组件之一或任何其他可观察的数据,例如 Rx。
主要区别在于 livedata 尊重 android 生命周期,而 rx observables 则没有。
使用 livedata,调用 onChange 时不会因活动停止而导致崩溃,因为它具有生命周期意识。 但如果没有 livedata,则由您来处理。
【讨论】:
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 之间的区别。
带 LiveData 的 ViewModel 与不带 LiveData 的 ViewModel 有何不同?
这取决于您,您是否需要 ViewModel 上的 LiveData?
我没有在 mvvm 模式的 viewmodel 类中实际使用 livedata。
了解 ViewModel 和 LiveData 的区别后,请阅读更多关于 MVVM 模式的内容。
Model-View-View-Model 中的 View Model 与 Jetpack 的 ViewModel 和 LiveData 不同。 MVVM 中的 View Model 是一个概念,您可以使用普通的 Java 类创建自己的 View Model。只要符合 MVVM 行为即可。
【讨论】:
MVVM 模式是只讲 V -> VM -> M 并反应 M -> VM -> V。这意味着 View 可以调用 ViewModel 上的方法,但 ViewModel 没有对 View 的引用在其上调用方法(设置数据)。从 ViewModel 到 View 的通信方式是通过 View 观察一些变量(ObservableField、LiveData、RxJava 等)。
LiveData 是一个很棒的可观察对象,用于在 viewModel 和 View 之间提供通信,尤其是在旋转等状态变化时。它还提供了模型和视图之间关于数据库更改和房间的良好通信。
【讨论】:
在简单的格式中,livedata 是神奇的可观察数据持有者类,它也是生命周期感知的。
如果你在viewmodel 中使用livedata:
livedata 发送任何setValue 或postValue,您的用户界面将能够观察到该值及其变化并显示在用户界面中。dataBinding 更好地观察livedata。【讨论】: