我正在构建一个采用 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/