【发布时间】:2020-02-09 10:54:30
【问题描述】:
我正在开发一个 Android 应用程序来训练演奏者的耳朵,让他们在吉他上重播他们从手机听到的任何声音。我按照以下方式制作了音符(和和弦)识别部分:一个显示信息并听取按钮的主线程,一个记录声音并发送要分析的数据的AsyncTask,另一个分析和发送数据的AsyncTask确定已播放的音符。
笔记识别是实时的,所以我把分析器AsyncTask放在ViewModel中。已识别的音符和和弦保存在LiveData 字段中,因此每当它们发生变化时,都会通知主线程(由View 表示)。
现在我正在开发一款使用这种识别功能的游戏,但我也打算制作一个调谐器。游戏和调谐器将使用相同的识别算法。
我的问题是:我应该如何处理这个问题? game 和 tuner 也将拥有自己的功能。我应该将 Analyzer ViewModel 与单个 game 和 tuner ViewModels 分开吗?这意味着我将为这两个Views 中的每一个使用两个ViewModels。我想我不应该在两个 ViewModels 中重复分析器代码,也不应该为 game 和 编写 的函数>tuner 在同一个ViewModel 中,因为会有无用的代码(游戏 永远不会使用单独的tuner 函数)。
【问题讨论】:
-
你的 model 中应该有你的通用识别算法(或者甚至在一些独立于模型的服务层中),而不是你的 viewmodel。视图模型是为了绑定到视图上,而不是执行像笔记识别这样的业务逻辑。
-
所以您建议在模型中记录和分析,并将最后识别的音符(或和弦)保存在
LiveData字段中。然后ViewModel将获得该字段,View将收到通知。这似乎是一个很好的解决方案。 -
这对我来说听起来很 MVVM :) 视图模型将负责将记录发送到模型并检索结果以将其公开给视图。
标签: android mvvm android-asynctask