我是一名业余的android开发人员,我正在制作一个音乐播放器应用程序,我需要在我的活动、片段和服务中拥有相同的对象实例(Song对象(,并且所有这些都能够操纵对象的状态。用户可以播放/暂停/下一首/上一首歌曲,如果是暂停或播放,所有用户都需要显示相同的当前歌曲信息和歌曲状态。
"我的活动"可以通过在所有片段上持久存在的底部布局来更改歌曲状态。我的片段可以通过播放列表页面选择/暂停歌曲来更改歌曲状态。我的服务可以通过暂停/恢复/下一首/上一首歌曲来通过通知栏更改歌曲状态。
我很难想出一个关于在哪里以及如何存储对象实例的解决方案。我想让它们都有一个Song对象实例,并通过发送广播来更新值,但我认为这不是最好的解决方案,而且看起来很草率。
要播放的歌曲URL也从服务器中检索。进行API调用的最佳位置在哪里?
如果有人能就如何做到这一点提出更好的方法,我们将不胜感激。非常感谢。
问候,
您可以创建一个具有活动范围的ViewModel,它将在Fragment/activity/Service之间共享。
class AudioPlayerViewModel: ViewModel {
val songLiveData = MutableLiveData<Song>()
fun playSong() {
// Todo your logic
}
fun stopSong() {
// Todo your logic
}
.
.
.
}
您将对歌曲进行的每一次更改都将通过ViewModel进行,Fragment/Activity/Service将观察歌曲LiveData中发生的更改,并相应地更新UI。
至于网络请求,我建议你看看改造图书馆。一种常见的做法是使用存储库模式,该模式将保存所有的网络和数据库调用,然后您可以在ViewModel中获取存储库的实例并执行该网络调用。您可以使用协程或RxJava来处理线程。
总结:
活动/片段/视图/服务。。。
负责UI交互,观察ViewModels中的数据,并对该数据进行相应的UI更改。
ViewModel
作为网络层和用户所看到的内容之间的互动者。他们修改数据,这样UI就可以保持沉默,不包含任何逻辑。
存储库
负责API&DB调用。