【发布时间】:2012-06-27 08:22:07
【问题描述】:
假设有两个线程:我的线程和 MediaPlayer 线程(发送 通过循环器向我发送消息)。我的游戏线程对用户输入做出反应: 如果用户暂停游戏,我也会调用 MediaPlayer.pause()。
考虑以下事件顺序:
- MediaPlayer 音频流到达其末尾,因此它将一个 OnCompletion 给我的消息
- 我的线程:MediaPlayer.pause() 由于用户操作而被调用
- 我收到 OnCompletion 调用(太晚了,pause() 已经 上面调用)
这个问题是 MediaPlayer.pause() 只允许在 PAUSED 和 STARTED 状态,但由于第 1 步,MediaPlayer 将 调用 pause() 时已经处于 PlaybackCompleted 状态。我懂了 两种解决方案:
- 捕捉异常
- 在调用 pause() 之前询问 MediaPlayer.isPlaying()
但是第二种方案在以下场景中存在问题:
- 游戏已启动,调用了 MediaPlayer.start(),但媒体播放器状态为 尚未开始
- 用户离开游戏,调用代码:if(isPlaying()) pause();
- MediaPlayer 进入 STARTED 状态(现在 isPlaying 将返回 true, 但为时已晚)
这里的问题是 isPlaying() 仍然会返回 false(因为 docs 也说),因此由于第 3 步,MediaPlayer 仍将启动。
是否有一个正确的解决方案,并且在这两种情况下都避免了异常? (或者我上面的思路有什么错误吗?)
更新
对 Geobits 的回答做出反应(我在这里这样做是因为我会引用 Android 文档):
是的,我也在做本地播放,和你一样测试了很多,一切看起来都很好。但是文档有点自相矛盾。第一部分(这个可以):
调用 start() 以恢复暂停的 MediaPlayer 对象的播放, 并且恢复的播放位置与暂停的位置相同。 当对 start() 的调用返回时,暂停的 MediaPlayer 对象将 回到 Started 状态。
还有来自同一页面的另一个引用:
播放可以暂停和停止,以及当前播放位置 可以调整。可以通过 pause() 暂停播放。当调用 pause() 返回,MediaPlayer 对象进入 Paused 状态。笔记 从 Started 状态到 Paused 状态的转换和 反之亦然 在播放器引擎中异步发生。 可能需要 在调用 isPlaying() 更新状态之前的一段时间,它 在流式内容的情况下可以是几秒。
后一句表示,当启动暂停的播放器时,状态更改可能需要时间(“反之亦然”)。到目前为止一切都很好,因为它只适用于内部播放器引擎,但接下来是疯狂的部分:“在调用 isPlaying() 时更新状态可能需要一些时间”。这意味着 isPlaying() 没有返回 OBSERVABLE 状态,而是取决于内部状态。这令人困惑。
【问题讨论】:
标签: java android media-player