Android 从viewModel代码到片段触发声音的更好方法?

Android 从viewModel代码到片段触发声音的更好方法?,android,android-fragments,viewmodel,Android,Android Fragments,Viewmodel,所以我正在开发我的第一个viewModel应用程序,它需要发出声音,比如 MediaPlayer.create(context, R.raw.app_start).start() 但这需要上下文,如果我理解正确,那么viewModel代码不应该引用上下文以避免内存泄漏,所以我需要片段来执行代码 为了从viewModel代码中触发片段中的声音,我可以在布尔值上定义一个状态观测器,并在viewModel中翻转它的状态以执行片段中的代码,但这看起来很混乱,因为我必须翻转它两次,以便为下一个声音需求做

所以我正在开发我的第一个viewModel应用程序,它需要发出声音,比如

MediaPlayer.create(context, R.raw.app_start).start()
但这需要上下文,如果我理解正确,那么viewModel代码不应该引用上下文以避免内存泄漏,所以我需要片段来执行代码

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


有没有更优雅的方法呢?

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

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

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