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

Releasing Media Player while preparing is causing app to freeze

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

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

        mMediaPlayer.release();
        mMediaPlayer=null;
    }


    super.onDestroy();
}

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

I/Choreographer: Skipped 112 frames!  The application may be doing too much work on its main thread.

所以只有当我在 activity 准备时销毁它才会发生这种冻结,但如果它已经处于准备状态,则不会发生。我使用 prepreAsync 从 Internet 获取媒体。 谢谢。非常感谢任何帮助。我被这个问题困了好几天了!

尝试取消重新检查媒体播放器是否 运行。

@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

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

 boolean prepared = false;
 boolean cancel = false;

之后在 onpreapred 方法中我将 prepared 设置为 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");
    }
}