2013-12-23 128 views
2

我现在遇到的问题是我的暂停并不总是有效。 我所拥有的是通过ActionBarSherlock和onClick监听器操作的主要活动中的MediaPlayer。 MediaPlayer使用带有MP3文件URL的ArrayList(其中一些长度为1秒)。Android MediaPlayer暂停

暂停代码:

 if (player.isPlaying()) { 
      if (player != null) { 
       player.pause(); 
       swapPlayIcon(1); 
       isPaused = true; 
       pauseMenuButt.setVisible(false); 
       playMenuButt.setVisible(true); 
      } 
     } 

swapPlayIcon(INT)只能处理可视性和可绘制互换。

启动代码:

Iterator<Uri> iterUri = tracks.iterator(); 
    while (iterUri.hasNext()) { 
     Uri tmpUri = iterUri.next(); 
     try { 
      player.reset(); 
      player.setDataSource(String.valueOf(tmpUri)); 
      player.prepare(); 
      player.start(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

编辑

更多的测试后,我发现,这个问题出现在 “之间” 的状态。

我的意思是,当我的MP3文件是2秒长,我点击暂停它不停止,因为它只是结束阅读一个文件,现在转移到下一个。

我已经加入:

 } else { 
      pauseLocked = true; 
     } 

如果statment暂停,并没有在它降落在所有测试时。 所以我不知道以前发现的“中间”问题。

+1

不知道答案是什么,但重要的是要注意,你在第一个块中有一些NullPointerException异常......你说if(player.isPlaying())然后检查player!= null 。如果玩家为空,则在调用player.isPlaying()时会看到一个NPE。您应该将空检查移出isPlaying()if语句,或者将其彻底删除。 – Matt

+0

是的,你确实是对的:> – JakubW

+0

首先关闭播放没有被阻塞,所以你可以像播放器从你的网址准备每个媒体流一样快地循环播放媒体。其次,你是不是[4.4,你想玩HLSs](http://code.google.com/p/android/issues/detail?id=63346&q=HLS&colspec=ID%20Type%20Status%20Owner%20Summary% 20Stars)? – dcow

回答

1

您的暂停按钮无法使用,因为在您启动最后一个网址之前,无法将其消息传送到MediaPlayer。你完全阻止了你的MediaPlayer运行的线程(我假设它是你的主要活动中的MediaPlayer以来的UI线程)。如果您要在与UI相同的线程上创建MediaPlayer,则应使用prepare:prepareAsync的异步版本。您需要在收到onMediaPrepared回拨后作出回应,然后启动媒体。一旦发生这种情况,您必须无所作为,等待媒体完成,然后才能加载另一个网址。

+0

好吧即时尝试这个,感谢帮助队友。 – JakubW

+0

是的媒体播放可能会让人非常困惑,无法掌握。媒体播放器本身是一个复杂的状态机,您的支持活动需要正确管理所有这些状态。像音频流循环这样看起来很简单的东西会变得非常复杂。祝你好运! – dcow