在Activity、Fragment和Service之间共享相同数据实例的最佳方式



我是一名业余的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调用。

相关内容

  • 没有找到相关文章

最新更新