如何使视图模型观察没有生命周期对象的存储库

How to make the viewmodel observe the repository without lifecycle object

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

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

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

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

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

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

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

1.First 最重要的是,如果您需要视图模型中的上下文,请使用 AndroidViewModel 。 2.Don不要在 Viewmodel 中做任何业务逻辑 class 因为它只是中介而不是在存储库中做计算 class 3.use rxjava/rxkotlin 在存储库中,return 从存储库方法到 Viewmodel 的可观察对象,一旦 Viewmodel 收到通知更新视图。

My problem is that LiveData require lifecycle object

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

observables are alive forever and this could lead to wierd crashes

不,它们在您处理它们之前一直存在,但您必须手动进行处理,因为 Rx 不提供 lifecycle-aware 订阅。

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 有 lifecycle-aware 观察。
但是 Repo 和 DataSource 没有生命周期,因此您应该手动管理订阅。 LiveData 和 Rx observables 都是可能的——你可以选择你喜欢的任何一个。

您可以使用 DataBinding 来反映您的 ViewModel 数据 UI。 https://developer.android.com/topic/libraries/data-binding

另一个好处是您编写的样板代码更少。