当前位置: 首页 > 知识库问答 >
问题:

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

乜承嗣
2023-03-14

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

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

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

我读过关于使用简单的可观测数据而不是LiveData的文章,但我也读到这是一种不好的做法,因为可观测数据永远都是存在的,这可能会导致wierd崩溃。此外,我还有PageKeyedDataSource,它只返回LiveData。

我还读过关于使用转换的书。但如果我不想只映射数据,而是想做更复杂的事情呢。

是否有一种方法可以使一个层安全地观察另一个层,而不必创建从视图层到数据源的LiveData可观察数据链?

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

共有3个答案

终波涛
2023-03-14

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

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

端木朝
2023-03-14

1.首先,如果您需要viewmodel中的上下文,请使用AndroidViewModel。2.不要在Viewmodel类中执行任何业务逻辑,因为它只是中介,而要在存储库类3中执行计算。在存储库中使用rxjava/rxkotlin,一旦Viewmodel收到更新视图的通知,就从存储库方法将可观察对象返回给Viewmodel。

商德泽
2023-03-14

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

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

可观测物是永远存在的,这可能会导致奇怪的崩溃

不,它们在您处理它们之前是活的,但是您必须手动操作,因为Rx不提供生命周期感知订阅。

是否有一种方法可以使一个层安全地观察另一个层,而不必创建从视图层到数据源的LiveData可观察数据链?

正如您所写的,您正在尝试创建一个观察ViewModel的视图,该视图观察Repo,该视图观察DataSource。这已经是一条链条了,你应该处理它。

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

 类似资料:
  • 我在工具栏上有一个搜索视图图标,通过创建选项菜单(菜单菜单)。单击该图标将创建一个 EditText 行,供用户输入搜索输入。我有一个文本观察器()附加到编辑文本行,以便当文本添加到该行时(在文本更改可编辑之后),搜索查询方法通过搜索房间数据库的视图模型运行。 我的问题是,观察者甚至在用户输入任何查询之前就开始创建了。使用Toasts,我能够在用户按下SearchView图标时以及用户输入任何搜索

  • 英文原文:http://emberjs.com/guides/object-model/observers/ Ember 为包括计算后属性在内的任意一种属性提供了观察器。可以通过使用 addObserver 方法来为一个对象设置一个观察器: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Person = Ember.Obj

  • 本文向大家介绍测试生命周期模型?相关面试题,主要包含被问及测试生命周期模型?时的应答技巧和注意事项,需要的朋友参考一下 V模型、W模型、瀑布模型、 螺旋模型、敏捷H模型 软件测试流程 1、需求分析,需求评审 2、制定测试计划、计划评审 3、编写测试用例、用例评审 4、测试实施阶段、执行测试用例 按照设计好的用例、准备好的数据和制定的测试策略,实施进行具体的测试过程 5、测试评估阶段 测试总结、缺陷

  • 每个响应对象只有当在 servlet 的 service 方法的范围内或在 filter 的 doFilter 方法范围内是有效的,除非该组件关联的请求对象已经开启异步处理。如果相关的请求已经启动异步处理,那么直到AsyncContext 的 complete 方法被调用,请求对象一直有效。为了避免响应对象创建的性能开销,容器通常回收响应对象。在相关的请求的startAsync 还没有调用时,开发

  • 每个请求对象只在一个 servlet 的 service 方法的作用域内,或过滤器的 doFilter 方法的作用域内有效,除非该组件启用了异步处理并且调用了请求对象的 startAsync 方法。在发生异步处理的情况下,请求对象一直有效,直到调用 AsyncContext 的 complete 方法。容器通常会重复利用请求对象,以避免创建请求对象而产生的性能开销。开发人员必须注意的是,不建议在上

  • 本文向大家介绍本地存储的生命周期是什么?相关面试题,主要包含被问及本地存储的生命周期是什么?时的应答技巧和注意事项,需要的朋友参考一下 : 和 都能控制数据的存储时间。 是一个绝对的过期时间, 是文档被访问之后的存活时间(是相对时间)。默认是 。 : 当会话被关闭后(浏览器、标签页被关闭),就会被清除。与 用法一样。 : 除非被主动清除,不然永久储存在浏览器中。 : 没有过期时间,除非主动清除。