【问题标题】:Different between ViewModel with LiveData vs ViewModel Without LiveData?带 LiveData 的 ViewModel 与不带 LiveData 的 ViewModel 有何不同?
【发布时间】:2019-07-17 09:41:42
【问题描述】:

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

【问题讨论】:

  • 如果你需要观察一个对象的状态,那么你需要LiveData。没有区别,我猜这都是关于要求和最佳实践的......

标签: android mvvm viewmodel android-livedata


【解决方案1】:

根据 Google Docs,如果您已经在使用 Rx 或 Agera 等库,则可以继续使用它们而不是 LiveData。但在这种情况下,您有责任在每个 Android 组件生命周期中处理对象分配和解除分配。

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

在这种情况下,您可以使用 livedata、架构组件之一或任何其他可观察的数据,例如 Rx。

主要区别在于 livedata 尊重 android 生命周期,而 rx observables 则没有。

使用 livedata,调用 onChange 时不会因活动停止而导致崩溃,因为它具有生命周期意识。 但如果没有 livedata,则由您来处理。

【讨论】:

    【解决方案2】:

    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 行为即可。

    【讨论】:

      【解决方案3】:

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

      LiveData 是一个很棒的可观察对象,用于在 viewModel 和 View 之间提供通信,尤其是在旋转等状态变化时。它还提供了模型和视图之间关于数据库更改和房间的良好通信。

      【讨论】:

        【解决方案4】:

        在简单的格式中,livedata 是神奇的可观察数据持有者类,它也是生命周期感知的。

        如果你在viewmodel 中使用livedata

        1. 您可以向livedata 发送任何setValuepostValue,您的用户界面将能够观察到该值及其变化并显示在用户界面中。
        2. 您可以使用dataBinding 更好地观察livedata
        3. 无需手动配置即可实现内存泄漏。

        【讨论】:

          猜你喜欢
          • 2019-02-04
          • 2019-10-10
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          • 1970-01-01
          • 2020-09-12
          相关资源
          最近更新 更多