准备时释放媒体播放器会导致应用冻结
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");
}
}
我有两个活动,一个主要 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");
}
}