代码之家  ›  专栏  ›  技术社区  ›  Josh Ribeiro

androidmvvm中的服务和视图模型-它们如何交互?

  •  2
  • Josh Ribeiro  · 技术社区  · 6 年前

    我使用Android架构的ViewModels已经有一段时间了,我从不将ViewModel暴露于上下文/视图(Android框架/UI)。然而,最近我遇到了一个有趣的问题。

    制作计时器应用程序时,当计时器启动时,会在后台运行一个运行计时器的服务。这样,当应用程序关闭时,计时器仍在通知栏的前台运行,直到所有计时器停止。但是,这意味着我的所有计时器对象和状态都包含在此服务中。我的UI需要在每次勾选时更新,但是模型不一定需要更新

    活动是否应该每次都接收LocalBroadcasts并通知ViewModel? 是否从服务读取UI状态->活动->虚拟机?看起来服务就是ViewModel,但这似乎效率不高。

    1 回复  |  直到 6 年前
        1
  •  13
  •   Josh Ribeiro    6 年前

    在对不同的结构进行了一些尝试之后,服务在MVVM中找到了自己的位置。在这种情况下,让我感到困惑的是,不应该从ViewModel启动服务,而且需要两个存储库:存储计时器的房间数据库和表示正在进行的计时器状态的服务(点击、播放/暂停状态等)。ViewModel不应该对视图有任何引用,但应用程序上下文是可以的。因此,通过扩展 AndroidViewModel公司 班级。最后的结构如下:

    模型层

    • 服务
    • 房间数据库 -存储计时器以备将来使用(名称、总时间等)

    • 视图模型 -侦听UI事件,执行业务逻辑,并发出EventBus帖子。模型中的任何更改都通过ViewModel进行通信

    用户界面

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

    服务不能直接与数据库通信。但它应该与存储库进行通信,这些存储库与SQLite/Room/Server等数据库进行通信。