我已经使用Android体系结构中的ViewModel已有一段时间了,并且恪守从不将ViewModel暴露于上下文/视图(Android Framework / UI)。但是,最近我遇到了一个有趣的问题。
制作计时器应用程序时,启动计时器时,将在运行计时器的后台运行服务。这样,当应用程序关闭时,计时器仍在通知栏中的前台运行,直到所有计时器都停止。但是,这意味着我所有的Timer对象和状态都包含在此服务中。我的UI需要在每个刻度上进行更新,但模型不一定需要更新 ViewModels如何适应这种情况?
该活动是否应每次接收LocalBroadcasts并通知ViewModel? 是否应该从Service-> Activity-> VM中读取UI状态?似乎服务似乎是ViewModel,但这似乎效率不高。
答案 0 :(得分:1)
在使用了不同的结构进行了一些玩弄之后,服务发现它已放置在MVVM中。在这种情况下让我烦恼的是,认为不应从ViewModel启动服务,并且必须要有两个存储库这一事实:用于存储计时器的Room数据库和用于表示正在进行的计时器状态的服务(onTick,播放/暂停)状态等)。 ViewModel不应具有对视图的任何引用,但应用程序上下文可以。因此,可以通过扩展 AndroidViewModel 类从ViewModel启动服务。这是最终的结构:
模型层
ViewModel
UI
答案 1 :(得分:1)
服务应被视为具有MVVM架构中的应用程序上下文的AndroidViewModel。 因为,该服务正在像ViewModels那样处理数据。
服务无法直接与数据库对话。但是它应该与存储库对话,而后者与SQLite / Room / Server等数据库对话。
由于ViewModel具有诸如“片段/活动”之类的视图。服务将其自身转换为具有状态栏Notification的Foreground Service,以进行更新。我们不将LiveData用于Notification的视图,而是更新通知本身(我们可以假定此为重新创建的Activity / Fragment)。