在准备状态下安全重置MediaPlayer?

时间:2011-02-11 17:08:56

标签: android

我正在使用MediaPlayer编写音频播放器,允许用户跳过实际调音。跳过请求可能随时发生,包括在调用MediaPlayer.prepareAsync和即将发生的onPrepared回调之间。医生说:

重要的是要注意,准备状态是一种临时状态,并且在MediaPlayer对象处于准备状态时调用任何具有副作用的方法的行为是未定义的。

这包括重置,甚至释放的调用吗?因为如果是这样的话,那么我要么必须等待onPrepared回调重用MediaPlayer,要么分配一个全新的MediaPlayer,如果我不想等待并在onPrepared回调上发布过时的那个,对吗?

3 个答案:

答案 0 :(得分:5)

我还建立了一个流音乐播放器,并在准备状态下挣扎。最糟糕的部分是有一些流,其中prepare()永远下载(缓冲)数据而没有调用onBufferUpdate。呼叫释放没有做任何事情。所以,我这样做的方式是在15秒后从被驱动的MediaPlayer上调用reset(),尽管文档中有建议。这导致它抛出异常并使其进入错误状态。捕获异常后我调用了release()。这似乎解决了这个问题。我希望这对某人有用。

答案 1 :(得分:3)

在我看来,我将遵循文档中的建议,我发现不同设备中的播放器存在一些问题(在某些设备中,重复使用同一播放器并不稳定)。

我认为一个好的选择是分配玩家,当用户跳过一个曲调时在它们之间切换,然后等待原始玩家到达准备状态然后你安全地重置它。

答案 2 :(得分:-1)

我正面临一个问题,当MP“挂起”准备状态太长(流)并且我试图使用reset()停止它。这导致MP挂起,因此我的整个应用程序冻结。似乎没有办法阻止MP准备状态。我在考虑使用prepare()包装在线程而不是prepareAsync()。然后我将能够杀死那个线程。至于现在,我是按照以下方式做到的:

        try {
            mp.setDataSource(new String());
        } catch (Exception e) {
            e.printStackTrace();
            android.util.Log.d(TAG,"actionCancel(): mp.setDataSource() exception");
            mp.reset();
        }

它工作4me。