Android MVVM中的服务和ViewModel-它们如何交互?

时间:2018-11-01 14:19:02

标签: android mvvm android-service android-architecture-components

我已经使用Android体系结构中的ViewModel已有一段时间了,并且恪守从不将ViewModel暴露于上下文/视图(Android Framework / UI)。但是,最近我遇到了一个有趣的问题。

制作计时器应用程序时,启动计时器时,将在运行计时器的后台运行服务。这样,当应用程序关闭时,计时器仍在通知栏中的前台运行,直到所有计时器都停止。但是,这意味着我所有的Timer对象和状态都包含在此服务中。我的UI需要在每个刻度上进行更新,但模型不一定需要更新 ViewModels如何适应这种情况?

该活动是否应每次接收LocalBroadcasts并通知ViewModel? 是否应该从Service-> Activity-> VM中读取UI状态?似乎服务似乎是ViewModel,但这似乎效率不高。

2 个答案:

答案 0 :(得分:1)

在使用了不同的结构进行了一些玩弄之后,服务发现它已放置在MVVM中。在这种情况下让我烦恼的是,认为不应从ViewModel启动服务,并且必须要有两个存储库这一事实:用于存储计时器的Room数据库和用于表示正在进行的计时器状态的服务(onTick,播放/暂停)状态等)。 ViewModel不应具有对视图的任何引用,但应用程序上下文可以。因此,可以通过扩展 AndroidViewModel 类从ViewModel启动服务。这是最终的结构:

模型层

  • 服务 -维护活动计时器列表,发出onTick()EventBus事件,保持活动计时器播放/暂停状态。一旦没有活动的计时器,结束自身。
  • 房间数据库 -存储计时器以供将来使用(名称,总时间等)

ViewModel

  • ViewModel -侦听UI事件,执行业务逻辑并发出EventBus帖子。模型的任何更改都可以通过ViewModel传达

UI

  • 活动 -执行应用程序流程任务。侦听相关的ViewModel通信以交换片段/开始新活动等。
  • 片段 -处理动画和UI。还通知ViewModel用户交互

答案 1 :(得分:1)

服务应被视为具有MVVM架构中的应用程序上下文的AndroidViewModel。 因为,该服务正在像ViewModels那样处理数据。

服务无法直接与数据库对话。但是它应该与存储库对话,而后者与SQLite / Room / Server等数据库对话。

由于ViewModel具有诸如“片段/活动”之类的视图。服务将其自身转换为具有状态栏Notification的Foreground Service,以进行更新。我们不将LiveData用于Notification的视图,而是更新通知本身(我们可以假定此为重新创建的Activity / Fragment)。