android - 如何使 View 模型观察没有生命周期对象的存储库

标签 android kotlin mvvm observable viewmodel

我正在构建一个采用 MVVM 设计的 android 应用程序,并且我有多个层(本地和远程的 View 、ViewModel、存储库和数据源)。 我希望我的存储库对象将观察数据源,执行有关如何以及何时存储缓存的所有逻辑,将数据映射到上层的正确形式,然后才将新数据通知 View 模型。

与此类似,我希望 ViewModel 观察存储库中是否有新数据到达,然后执行所有业务逻辑,然后才通知 View 。

我的问题是 LiveData 需要 ViewModel 和 存储库没有。

我读到过有关使用简单的可观察对象而不是 LiveData 的信息,但我也读到这是一种不好的做法,因为可观察对象永远存在,这可能会导致奇怪的崩溃。此外,我还有仅返回 LiveData 的 PageKeyedDataSource。

我还阅读了有关使用 Transformations.map 的信息,但如果我不想只映射数据而是想做一些更复杂的事情怎么办。

有没有一种方法可以让一层安全地观察另一层,而无需创建从 View 层到数据源的 LiveData 可观察链?

注意:如果相关的话,我的 ViewModel 会在多个 fragment 中使用。

最佳答案

My problem is that LiveData require lifecycle object

实际上,生命周期是可选的。 LiveData中有一个observeForever(Observer)方法,不需要生命周期。但这意味着您还应该在存储库完成工作时手动调用 removeObserver(Observer),否则会发生泄漏。
这与使用 Rx 的 observables 并没有太大区别。在这两种情况下,您都应该在您的 View 模型中覆盖 onCleared() 并手动从存储库中取消订阅(或删除观察者)。

observables are alive forever and this could lead to wierd crashes

不,它们在您处置它们之前一直存在,但您必须手动进行处置,因为 Rx 不提供生命周期感知订阅。

Is There a way to make one layer safely observe another layer without creating a chain of LiveData observables from the view layer to the DataSource?

如您所写,您正在尝试执行一个 View-that-observes-ViewModel-that-observes-Repo-that-observes-DataSource。它已经是一条链,你应该处理它。

可以从 ViewModel 安全地观察 LiveData,因为 View 有生命周期,而 LiveData 有生命周期感知观察。
但是 Repo 和 DataSource 没有生命周期,因此您应该手动管理订阅。 LiveData 和 Rx observables 都是可能的——你可以选择你喜欢的任何一个。

关于android - 如何使 View 模型观察没有生命周期对象的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56942977/

相关文章:

Android:如何通过短信发送和接收数据

xml - Kotlin:格式化字符串

xaml - 人们在 Windows 8 中使用什么来代替 IMultiValueConverters?

c# - MVVM light示例代码中DataItem的目的是什么?为什么要这样实现?

silverlight - Silverlight-如何基于 View 中的属性调用命令

Android - URLConnection 的默认用户代理?

android - 如何在 TabActivity 中隐藏选项卡?

android - 如何有条件地在 ionic 4 中设置根页面?

android - 我如何访问 Kotlin 中的枚举值

android - 如何从 DAO 中获得 Deferred?