【问题标题】:One ViewModel for multiple Views or multiple ViewModels for a single View?一个 ViewModel 用于多个 View 还是多个 ViewModel 用于一个 View?
【发布时间】:2020-02-09 10:54:30
【问题描述】:

我正在开发一个 Android 应用程序来训练演奏者的耳朵,让他们在吉他上重播他们从手机听到的任何声音。我按照以下方式制作了音符(和和弦)识别部分:一个显示信息并听取按钮的主线程,一个记录声音并发送要分析的数据的AsyncTask,另一个分析和发送数据的AsyncTask确定已播放的音符。

笔记识别是实时的,所以我把分析器AsyncTask放在ViewModel中。已识别的音符和和弦保存在LiveData 字段中,因此每当它们发生变化时,都会通知主线程(由View 表示)。

现在我正在开发一款使用这种识别功能的游戏,但我也打算制作一个调谐器。游戏和调谐器将使用相同的识别算法。

我的问题是:我应该如何处理这个问题? gametuner 也将拥有自己的功能。我应该将 Analyzer ViewModel 与单个 gametuner ViewModels 分开吗?这意味着我将为这两个Views 中的每一个使用两个ViewModels。我想我不应该在两个 ViewModels 中重复分析器代码,也不应该为 game 编写 的函数>tuner 在同一个ViewModel 中,因为会有无用的代码(游戏 永远不会使用单独的tuner 函数)。

【问题讨论】:

  • 你的 model 中应该有你的通用识别算法(或者甚至在一些独立于模型的服务层中),而不是你的 viewmodel。视图模型是为了绑定到视图上,而不是执行像笔记识别这样的业务逻辑。
  • 所以您建议在模型中记录和分析,并将最后识别的音符(或和弦)保存在LiveData字段中。然后ViewModel 将获得该字段,View 将收到通知。这似乎是一个很好的解决方案。
  • 这对我来说听起来很 MVVM :) 视图模型将负责将记录发送到模型并检索结果以将其公开给视图。

标签: android mvvm android-asynctask


【解决方案1】:

实际上,您的 Model 中(甚至在独立于 Model 的某些服务层中)可能应该有您的通用识别算法,而不是在您的 ViewModel强>。将ViewModel 绑定到View,而不是执行诸如笔记识别之类的业务逻辑。

在这种情况下,ViewModel 将负责将录音发送到Model,后者将它们保存为LiveData 对象。例如,ViewModel 检索它们并将它们公开给View 作为LiveDataViewModel 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2013-08-08
    • 2017-10-19
    • 2014-07-30
    相关资源
    最近更新 更多