我是一个业余的android开发人员,我制作了一个音乐播放器应用程序,我需要有相同的对象实例(歌对象)在我的活动,片段和服务,他们都有能力操纵对象的状态。用户可以播放/暂停/下一首/上一首歌曲,如果歌曲暂停或播放,所有用户都需要显示相同的当前歌曲信息和歌曲状态。
我的活动可以通过在所有片段上持久化的底部布局来更改歌曲状态。我的片段可以通过播放列表页面选择/暂停歌曲来更改歌曲状态。我的服务可以通过通知栏暂停/继续/下一步/上一首歌曲来更改歌曲状态。
我想不出在哪里以及如何存储对象实例的解决方案。我想让它们都有一个Song对象实例,并通过发送广播来更新值,但我不认为这是最好的解决方案,而且看起来相当马虎。
还从服务器检索要播放的歌曲URL。哪里是进行API调用的最佳位置?
如果有人能就如何做到这一点提出更好的方法,我们将不胜感激。谢谢!
致以敬意,
发布于 2020-08-07 16:11:30
您可以创建一个具有activity作用域的ViewModel,它将在片段/活动/服务之间共享。
class AudioPlayerViewModel: ViewModel {
val songLiveData = MutableLiveData<Song>()
fun playSong() {
// Todo your logic
}
fun stopSong() {
// Todo your logic
}
.
.
.
}您对歌曲所做的每个更改都将通过ViewModel完成,片段/活动/服务将观察到songLiveData中发生的更改,并相应地更新UI。
至于网络请求,我建议您看看改进库。一种常见的做法是使用存储库模式,该模式将保存所有网络和DB调用,然后您可以在ViewModel中获取存储库的一个实例并执行该网络调用。您可以使用协程或RxJava来处理线程。
总结一下:
活动/片段/视图/服务...
负责与ViewModels中观察到的数据进行UI交互,并根据这些数据进行UI更改。
ViewModel
在网络层和用户看到的内容之间承担交互角色的责任。他们修改数据,这样UI就可以保持静默,不包含任何逻辑。
存储库
负责API和DB的调用。
https://stackoverflow.com/questions/63297527
复制相似问题