【问题标题】:Why do we return Live Data from the repository? (MVVM Android) [closed]为什么我们从存储库返回实时数据? (MVVM Android)[关闭]
【发布时间】:2020-01-27 07:20:04
【问题描述】:

许多示例将 LiveData 从存储库返回到 ViewModel

public class Repository{

    private fun getText(): LiveData<String> = FakeDataBase.text
}

但是如果我们只返回 String 并将返回的 Data 设置到 ViewModel 中的 LiveData 中,会有什么不同吗?

例如,当我们使用 Retrofit 时,我们会返回一个调用对象,并且大多数情况下我们将调用对象转换为具有特殊类的 LiveData。所以我们可以跳过这一步,从 Call Object 中获取值,在 ViewModel 中返​​回,然后将值设置到 ViewModel 中的 LiveData 中

【问题讨论】:

    标签: java android kotlin mvvm android-livedata


    【解决方案1】:

    问题在于您的存储库正在执行一些耗时的任务。
    如果您只是等待它完成,您的 ViewModel 将在该时间段内被阻止。当存储库返回 LiveData 对象时,它实际上是一个合同,声明“当我获得数据时,如果你订阅我,我会通知你”。完成后它将在不同的线程上运行耗时的任务,它将更新其 LiveData 对象并通知所有观察者。 如果您需要来自不同 ViewModel 的存储库中的相同数据,则真正的好处是,每个 ViewModel 将简单地订阅相同的 LiveData 对象。

    【讨论】:

      【解决方案2】:

      我看到的许多示例都没有使用 LiveData 从存储库通信回 ViewModel,包括 Google 架构示例中的示例:

      Android Architecture Blueprints v2

      我越来越经常看到人们将数据包装在自定义 Result 类中,就像本例中的类一样。

      所以对你的问题没有正确的回答,这取决于你想做什么。 LiveData 完全是关于可观察模式(具有生命周期支持),是否有一些东西向这个 LiveData 发布值?或者你只是在做同步操作(你提到改造调用)?如果是最后一种情况,您只需返回字符串即可。

      【讨论】:

        【解决方案3】:

        答案在于函数式编程范式。在更复杂的情况下,您希望开始对刚刚获取的结果应用运算符。假设您想根据结果从另一个服务数据中获取,然后在最后附加成功。 在功能样式中,它看起来像:

        repo.fetchResult()
          .flatMap { repo2.fetchSecondResultById(it) }
          .map { it.concat("success") }
        

        这只是一个简单的示例,根据您的业务案例,它可能会变得更糟。当然,函数库中还有更多运算符可以帮助处理更复杂的情况。 现在,LiveData 进来了。 LiveData 是 Google 尝试做出的反应式实现。但后来,他们意识到 RxJava 被大量使用,他们决定不再继续努力。与此同时,Kotlin 在 Android 中获得了吸引力。 Kotlin 附带 Coroutines 和 Flow,后者也是另一个反应式库。然后谷歌为了不分裂生态系统,更决定放弃 LiveData 工作,它只保留在旧样本中,或者当您想要将事件从 ViewModel 传递到 View 时。

        但是,让 LiveData 可链接或功能化的努力还停留在海上。使用 Flow 或 RxJava。 您的 repo 应该返回 Single 或 Observable 或 Flow。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-12
          • 2018-05-08
          • 2018-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-08
          相关资源
          最近更新 更多