准备时释放媒体播放器会导致应用程序冻结

时间:2016-06-18 01:02:34

标签: android android-mediaplayer

我有两个活动主要活动,包括Recyclerview和每次用户点击Recyclerview的其中一个项目时启动的详细活动。 detailedActivity有一个mediaplayer组件,每次创建详细的活动时都会创建该组件。现在在onDestroy方法中,我总是通过以下代码释放mediaPlayer所占用的资源:

!

每当我在媒体播放器仍在准备时单击后退按钮时,应用程序会冻结一段时间。我在logcat中收到的消息是:

@Override
 protected void onDestroy() {
    if (mMediaPlayer != null) {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();}

        mMediaPlayer.release();
        mMediaPlayer=null;
    }


    super.onDestroy();
}

所以这种冻结只会在我准备时销毁活动时发生,但如果它已经处于准备好的状态,它就不会发生。我使用prepreAsync从互联网上获取媒体。 谢谢。任何帮助都非常感谢。我好几天都陷入了这个问题!

2 个答案:

答案 0 :(得分:1)

如果媒体播放器正在运行,请尝试删除重新检查。

@Override
protected void onDestroy() {
  if (mMediaPlayer != null) {
    mMediaPlayer.stop();
    mMediaPlayer.release();
  }
  super.onDestroy();
}

如果仍然发生,请尝试删除onDestroy()中的检查媒体播放器。

- 更新 -

这可能与此错误有关:
https://code.google.com/p/android/issues/detail?id=959

这可能是一个帮助:
Android MediaPlayer reset freezes UI

答案 1 :(得分:0)

行。我有点解决这个问题。我正在为可能遇到与我相同情况的任何人写这篇文章。我在类的范围内制作了两个布尔标志,如下所示:

 boolean prepared = false;
 boolean cancel = false;

之后在onpreapred方法中,我将准备好设置为true。

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

            prepared = true;

        }
    });

在onDestroy方法中,我检查媒体播放器是否已经准备好,如果准备好,我会从它自己的方法中释放它。

@Override
protected void onDestroy() {
    if (mMediaPlayer != null) {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }
    if (prepared) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        cancel = true;

    }


    super.onDestroy();
}

否则,我将cancel设置为true并在OnBufferingUpdateListener接口上实现并覆盖其方法并从那里释放媒体播放器。

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {

    if (cancel) {
        mp.reset();
        mp.release();
        mMediaPlayer = null;
        Log.i("msg", " mp released");
    }
}