如何使ViewModel观察没有生命周期对象的存储库

时间:2019-07-08 21:52:19

标签: android kotlin mvvm observable viewmodel

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

类似地,我希望ViewModel观察存储库中是否有新数据到达,然后执行所有业务逻辑,并在此之后通知视图。

我的问题是LiveData需要生命周期对象,而ViewModel和 该存储库没有。

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

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

是否有一种方法可以使一层安全地观察另一层而无需创建从视图层到数据源的LiveData可观察对象链?

注意:如果某种程度上相关,我的ViewModel将用于多个片段中。

3 个答案:

答案 0 :(得分:1)

  

我的问题是LiveData需要生命周期对象

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

  

可观察物永远存在,并且可能导致死机

不,在您将它们销毁之前,它们还活着,但是您必须手动进行操作,因为Rx不提供可识别生命周期的订阅。

  

是否有一种方法可以使一层安全地观察另一层而无需创建从视图层到数据源的LiveData可观察对象链?

正如您所写,您正在尝试创建一个View-that-observs-ViewModel-observed-Repo-that-observs-DataSource。它已经是一条链了,您应该处理它。

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

答案 1 :(得分:0)

1。首先,如果需要在viewmodel中使用上下文,请使用AndroidViewModel。 2不要在Viewmodel类中做任何业务逻辑,因为它只是中介者,而是在存储库类中进行计算 3.在仓库中使用rxjava / rxkotlin并在仓库通知模型更新视图后,通过仓库方法将可观察对象返回给Viewmodel。

答案 2 :(得分:0)

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

另一个好处是,您可以减少样板代码。