如何使视图模型观察没有生命周期对象的存储库
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
另一个好处是您编写的样板代码更少。
我正在使用 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
另一个好处是您编写的样板代码更少。