从 viewModel 代码到 Fragment 触发声音的更好方法?

Better way to trigger a sound from viewModel code to Fragment?

所以我正在开发我的第一个 viewModel 应用程序,它需要发出类似...

的声音
MediaPlayer.create(context, R.raw.app_start).start()

但这需要上下文,如果我理解正确的话上下文不应被 viewModel 代码引用以避免内存泄漏,所以我需要我的片段来执行代码。

为了从 viewModel 代码触发片段中的声音,我可以在布尔值上定义一个状态观察器并在 viewModel 中翻转它的状态以执行片段中的代码,但这看起来很乱,因为我必须翻转它两次,以便为下一次声音需求做好准备。

有没有更优雅的方式?

嗯。好吧,使用可观察对象,您刚刚遇到了经典的“观察事件”问题。 标准 Google observables 用法是针对一个值(状态),正如您所注意到的,您遇到了需要“重置”该值的问题(发布相同的值不会通知观察者)。

解决这个问题的方法有很多,但根据您的需要,一个快速(恕我直言,实际上有点老套)的解决方案是使用时间戳(可能是毫秒时间值)作为触发器。 每次推送该值时,它都会有所不同,因此会在片段中观察到。

在像这样的大多数情况下,您并不真正关心值,它只是一个触发器..在这种情况下播放声音..但它也可以很容易地退出片段,或其他什么否则。