gpt4 book ai didi

当获取 mediaPlayer.getCurrentPosition 和 SeekBar 在暂停时进入初始状态时出现 java.lang.illegalStateException

转载 作者:行者123 更新时间:2023-12-02 10:48:47 26 4
gpt4 key购买 nike

每次关闭 Activity 时,我都会在 Android 音乐播放器应用程序中收到 java.lang.IllegalStateException

                mCurrentPosition = mediaPlayer.getCurrentPosition()/1000; // In milliseconds

我已经尝试了几乎所有可用的代码,甚至是 java.lang.illegalStateException randomly occurs when getting mediaPlayer.getCurrentPosition 上的所有代码。还有

这是我正在使用的 Java 代码:

protected void initializeSeekBar(){
mSeekBar.setMax(mediaPlayer.getDuration()/1000);

mRunnable = new Runnable() {
@Override
public void run() {
int mCurrentPosition;
if(mediaPlayer!=null && mediaPlayer.isPlaying()){
mCurrentPosition = mediaPlayer.getCurrentPosition()/1000; // In milliseconds
}
else {
mCurrentPosition = 0;
}

if (mSeekBar != null) {
mSeekBar.setProgress(mCurrentPosition);
getAudioStats();
}
handler.postDelayed(mRunnable,1000);
}
};
handler.postDelayed(mRunnable,1000);
}

请帮我摆脱这个困境。提前致谢

编辑 1另外,当音乐暂停和播放时,我的 Seekbar 就会启动,它会从暂停前的位置继续

mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
getAudioStats();
initializeSeekBar();

if(mediaPlayer != null && fromUser) {
mediaPlayer.seekTo(progress * 1000);
}


}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
});

protected void getAudioStats(){
long duration = mediaPlayer.getDuration()/1000; // In milliseconds
long due = (mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition())/1000;
long pass = duration - due;

String test = DateUtils.formatElapsedTime(pass);
String test1 = DateUtils.formatElapsedTime(due);

current_time.setText("" + test);
//mDuration.setText("" + duration + " seconds");
total_time.setText("" + test1);
}

最佳答案

当 Activity 关闭时(或者更好的是,当 Activity 暂停时),您需要从处理程序队列中删除可运行的对象。尝试将其放入 Activity 的 onPause() 方法中:

handler.removeCallbacks(mRunnable);

为了获得额外的鲁棒性,在可运行本身内部,您应该仅在 Activity 仍处于 Activity 状态时重新对可运行进行排队。所以代替这个:

handler.postDelayed(mRunnable,1000);

您应该这样做(假设此代码位于 Activity 类中):

if (!isDestroyed()) {
handler.postDelayed(mRunnable,1000);
}

还要确保在 Activity 被销毁之前停止媒体播放器。

附注如果您多次调用 initializeSeekBar(),您将重新分配 mRunnable 并将旧的保留在处理程序队列中,这可能会在以后造成麻烦。要解决此问题,您应该将其添加到 initializeSeekBar() 的开头:

protected void initializeSeekBar(){
if (mRunnable != null) {
handler.removeCallbacks(mRunnable);
}
// ... the rest of the method that you currently have

关于当获取 mediaPlayer.getCurrentPosition 和 SeekBar 在暂停时进入初始状态时出现 java.lang.illegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52337470/

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