我有两个活动主要活动,包括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从互联网上获取媒体。 谢谢。任何帮助都非常感谢。我好几天都陷入了这个问题!
答案 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");
}
}