作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发音乐播放器应用程序,我正在使用 MediaPlayer
播放音乐。流媒体工作正常,但现在我想要如果用户按下 Activity 的后退按钮,那么它应该立即停止准备并释放媒体播放器。
目前,当它正在准备时,如果 Activity 正在被销毁,那么我将像这样释放 MediaPlayer
,但是当它释放它时,它会挂起应用程序并显示 ANR。
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer!=null) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
我正在像下面这样初始化 MediaPlayer
mediaPlayer = null;
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource("http://www.samisite.com/sound/cropShadesofGrayMonkees.mp3");
现在我想当它开始准备然后在我在 onDestory
中释放时按下后退键,那么它不应该挂起应用程序并顺利释放媒体播放器。
请帮助我最好的方法是什么。提前致谢 mediaPlayer.prepareAsync();
最佳答案
检查答案 here .和 MediaPlayer State Diagram来自安卓代码。
编辑:
@TGMCians 我向他展示了提供的链接,因此,如果播放仍未准备好或正在准备中,他将无法调用 stop()
,直到它被调用 onPrepared
。我不确定 onPrepared
在应用程序 onDestroy
调用后继续调用。所以,我认为完整的 fragment 是:
private boolean mPrepared = false;
private boolean mCancel = false;
public void onPrepared(MediaPlayer player){
mPrepared = true;
if(mCancel){
player.release();
mPrepared = false;
mCancel = false;
//nullify your MediaPlayer reference
mediaPlayer = null;
}
}
private void cancelMedia(){
mCancel = true;
}
@Override
protected void onDestroy() {
super.onDestroy();
cancelMedia();
if (mediaPlayer != null && mPrepared) {
mediaPlayer.stop();
mediaPlayer.release();
mPrepared = false;
mediaPlayer = null;
}
}
关于android - 如何在准备时释放媒体播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33340470/
我是一名优秀的程序员,十分优秀!