Android MVVM 中的服务和 ViewModel - 它们如何交互?
Services and ViewModels in Android MVVM - How do they interact?
我使用 Android 架构中的 ViewModel 已有一段时间了,并遵守从不将 ViewModel 暴露给 Context/Views (Android Framework/UI) 的规定。但是,最近我 运行 遇到了一个有趣的问题。
制作定时器应用程序时,当定时器启动时,服务 运行 在后台 运行 启动定时器。这样,当应用程序关闭时,计时器仍然 运行s 在通知栏的前台,直到所有计时器都停止。但是,这意味着我的所有 Timer 对象和状态都包含在此服务中。我的 UI 需要在每次更新时更新,但模型不一定需要更新 ViewModel 如何适应这种情况?
Activity 是否应该每次都接收 LocalBroadcasts 并通知 ViewModel?
UI 状态应该从 Service->Activity->VM 读取吗?看起来 Service 几乎就是 ViewModel,但这似乎效率不高。
在尝试了一些不同的结构之后,该服务已找到它在 MVVM 中的位置。在这种情况下,让我失望的是认为服务不应该从 ViewModel 启动,并且需要两个存储库这一事实:用于存储计时器的房间数据库和用于表示正在进行的计时器状态的服务(onTick,play/pause 状态等)。 ViewModel 不应该有任何对视图的引用,但应用程序上下文是可以的。因此,通过扩展 AndroidViewModel class 可以从 ViewModel 启动服务。这是最终结构:
模型层
- Service - 维护活动计时器列表,发出 onTick() EventBus 事件,维护活动计时器 play/pause 状态.一旦没有活动计时器就自行结束。
- 房间数据库 - 存储计时器以备将来使用(名称、总时间等)
ViewModel
- ViewModel - 监听 UI 事件,执行业务逻辑,并发出 EventBus 消息。模型中的任何更改都通过 ViewModel
传达
UI
- Activity - 执行应用程序流任务。侦听相关的 ViewModel 通信以交换 fragments/start 新活动等
- Fragment - 处理动画和 UI。还通知 ViewModel 用户交互
服务应被视为在 MVVM 架构中具有应用程序上下文的 AndroidViewModel。
因为,该服务正在像 ViewModel 一样处理数据。
服务不能直接与数据库对话。但它应该与 Repositories 对话,而 repositories 与 SQLite/Room/Server.
等数据库对话
因为 ViewModel 有类似 Fragment/Activity 的视图。服务将自身转换为带有状态栏通知的前台服务,因为它是要更新的视图。我们不将 LiveData 用于通知的视图,而是更新通知本身(我们可以假设这是 Activity/Fragment 重新创建的)。
我使用 Android 架构中的 ViewModel 已有一段时间了,并遵守从不将 ViewModel 暴露给 Context/Views (Android Framework/UI) 的规定。但是,最近我 运行 遇到了一个有趣的问题。
制作定时器应用程序时,当定时器启动时,服务 运行 在后台 运行 启动定时器。这样,当应用程序关闭时,计时器仍然 运行s 在通知栏的前台,直到所有计时器都停止。但是,这意味着我的所有 Timer 对象和状态都包含在此服务中。我的 UI 需要在每次更新时更新,但模型不一定需要更新 ViewModel 如何适应这种情况?
Activity 是否应该每次都接收 LocalBroadcasts 并通知 ViewModel? UI 状态应该从 Service->Activity->VM 读取吗?看起来 Service 几乎就是 ViewModel,但这似乎效率不高。
在尝试了一些不同的结构之后,该服务已找到它在 MVVM 中的位置。在这种情况下,让我失望的是认为服务不应该从 ViewModel 启动,并且需要两个存储库这一事实:用于存储计时器的房间数据库和用于表示正在进行的计时器状态的服务(onTick,play/pause 状态等)。 ViewModel 不应该有任何对视图的引用,但应用程序上下文是可以的。因此,通过扩展 AndroidViewModel class 可以从 ViewModel 启动服务。这是最终结构:
模型层
- Service - 维护活动计时器列表,发出 onTick() EventBus 事件,维护活动计时器 play/pause 状态.一旦没有活动计时器就自行结束。
- 房间数据库 - 存储计时器以备将来使用(名称、总时间等)
ViewModel
- ViewModel - 监听 UI 事件,执行业务逻辑,并发出 EventBus 消息。模型中的任何更改都通过 ViewModel 传达
UI
- Activity - 执行应用程序流任务。侦听相关的 ViewModel 通信以交换 fragments/start 新活动等
- Fragment - 处理动画和 UI。还通知 ViewModel 用户交互
服务应被视为在 MVVM 架构中具有应用程序上下文的 AndroidViewModel。 因为,该服务正在像 ViewModel 一样处理数据。
服务不能直接与数据库对话。但它应该与 Repositories 对话,而 repositories 与 SQLite/Room/Server.
等数据库对话因为 ViewModel 有类似 Fragment/Activity 的视图。服务将自身转换为带有状态栏通知的前台服务,因为它是要更新的视图。我们不将 LiveData 用于通知的视图,而是更新通知本身(我们可以假设这是 Activity/Fragment 重新创建的)。