Android MediaPlayer行为(事件顺序保证)

时间:2012-06-21 12:14:19

标签: java android media-player

假设两个线程:我的线程和MediaPlayer线程(发送 通过looper发给我的消息)。我的游戏线程对用户输入作出反应: 如果用户暂停游戏,我也会调用MediaPlayer.pause()。

考虑以下事件顺序:

  1. MediaPlayer音频流到达终点,因此它会排队 OnCompletion消息给我
  2. 我的主题:由于用户操作而调用的MediaPlayer.pause()
  3. 我收到OnCompletion电话(太晚了,暂停()已经 上面提到的)
  4. 这个问题是MediaPlayer.pause()只允许进入 PAUSED和STARTED状态,但由于步骤1,MediaPlayer会 调用pause()时已经处于PlaybackCompleted状态。我知道了 两个解决方案:

    1. 捕捉异常
    2. 在调用pause()
    3. 之前询问MediaPlayer.isPlaying()

      但是第二种解决方案在以下情况中存在问题:

      1. 游戏开始,MediaPlayer.start()调用,但媒体播放器状态为 还没有 STARTED
      2. 用户离开游戏,调用代码:if(isPlaying())pause();
      3. MediaPlayer进入STARTED状态(现在isPlaying将返回true, 但为时已晚)
      4. 这里的问题是isPlaying()仍将返回false(如 文档也说,所以MediaPlayer仍然会因为第3步而启动。

        是否存在正确的解决方案并避免两种情况下的异常? (或者我上面的思路是否有任何错误?)


        更新

        对Geobits的回答做出反应(我这样做是因为我引用了Android doc):

        是的,我也在做本地播放,像你一样对它进行了很多测试,一切看起来都很好。但文档有点自相矛盾。第一部分(这没关系):

          

        调用start()以恢复暂停的MediaPlayer对象的播放,   并且恢复的播放位置与暂停的位置相同。   当对start()的调用返回时,暂停的MediaPlayer对象进入   回到已启动状态

        同一页的另一个引用:

          

        可以暂停和停止播放,以及当前播放位置   可以调整。可以通过pause()暂停播放。什么时候打电话给   pause()返回,MediaPlayer对象进入Paused状态。注意   从Started状态到Paused状态的转换和   反之亦然在播放器引擎中异步发生。 可能需要   在调用isPlaying()之前更新状态的时间   在流内容的情况下可以是几秒钟。

        后者说,当开始暂停的玩家时,状态改变可能需要时间(“反之亦然”)。到目前为止一切都那么好,因为它只适用于内部播放器引擎,但随后出现了疯狂的部分:“在调用isPlaying()”之前,状态更新可能需要一些时间。这意味着isPlaying()没有返回OBSERVABLE状态,而是取决于内部状态。这很令人困惑。

1 个答案:

答案 0 :(得分:2)

我已经使用MediaPlayer完成了一些应用,并且每次使用if(isPlaying()) pause();都没有任何不良影响。但这与当地媒体有关。如果您正在流式传输,延迟可能实际上会导致第二类问题。

尝试一下,看看你是否可以打破它。如果你做不到,那就没什么好担心的了。如果可以的话,你可以随时解决它。当你调用start()时,设置一个布尔值,排队暂停,我确定还有其他方法我没想到。

但先试试吧。它对我来说表现很好,而且我已经玩过我的废话。