gpt4 book ai didi

android - 准备时释放媒体播放器会导致应用卡住

转载 作者:行者123 更新时间:2023-11-30 01:15:43 24 4
gpt4 key购买 nike

我有两个 Activity ,一个是具有 Recyclerview 的主 Activity ,另一个是每次用户单击 Recyclerview 的其中一项时都会启动的 detailedActivity。 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 获取媒体。谢谢。非常感谢任何帮助。我被这个问题困了好几天了!

最佳答案

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

 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 接口(interface)上实现并覆盖其方法并从那里释放媒体播放器。

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

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

关于android - 准备时释放媒体播放器会导致应用卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com