假设两个线程:我的线程和MediaPlayer线程(发送 通过looper发给我的消息)。我的游戏线程对用户输入作出反应: 如果用户暂停游戏,我也会调用MediaPlayer.pause()。
考虑以下事件顺序:
这个问题是MediaPlayer.pause()只允许进入 PAUSED和STARTED状态,但由于步骤1,MediaPlayer会 调用pause()时已经处于PlaybackCompleted状态。我知道了 两个解决方案:
但是第二种解决方案在以下情况中存在问题:
这里的问题是isPlaying()仍将返回false(如 文档也说,所以MediaPlayer仍然会因为第3步而启动。
是否存在正确的解决方案并避免两种情况下的异常? (或者我上面的思路是否有任何错误?)
更新
对Geobits的回答做出反应(我这样做是因为我引用了Android doc):
是的,我也在做本地播放,像你一样对它进行了很多测试,一切看起来都很好。但文档有点自相矛盾。第一部分(这没关系):
调用start()以恢复暂停的MediaPlayer对象的播放, 并且恢复的播放位置与暂停的位置相同。 当对start()的调用返回时,暂停的MediaPlayer对象进入 回到已启动状态。
同一页的另一个引用:
可以暂停和停止播放,以及当前播放位置 可以调整。可以通过pause()暂停播放。什么时候打电话给 pause()返回,MediaPlayer对象进入Paused状态。注意 从Started状态到Paused状态的转换和 反之亦然在播放器引擎中异步发生。 可能需要 在调用isPlaying()之前更新状态的时间 在流内容的情况下可以是几秒钟。
后者说,当开始暂停的玩家时,状态改变可能需要时间(“反之亦然”)。到目前为止一切都那么好,因为它只适用于内部播放器引擎,但随后出现了疯狂的部分:“在调用isPlaying()”之前,状态更新可能需要一些时间。这意味着isPlaying()没有返回OBSERVABLE状态,而是取决于内部状态。这很令人困惑。
答案 0 :(得分:2)
我已经使用MediaPlayer完成了一些应用,并且每次使用if(isPlaying()) pause();
都没有任何不良影响。但这与当地媒体有关。如果您正在流式传输,延迟可能实际上会导致第二类问题。
尝试一下,看看你是否可以打破它。如果你做不到,那就没什么好担心的了。如果可以的话,你可以随时解决它。当你调用start()
时,设置一个布尔值,排队暂停,我确定还有其他方法我没想到。
但先试试吧。它对我来说表现很好,而且我已经玩过我的废话。