每次关闭活动时,我都会在我的安卓音乐播放器应用程序中获得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);
}
发布于 2018-09-15 02:36:48
当活动关闭时(或者更好的是,当它暂停时),您需要从处理程序队列中删除runnable。尝试将其放入您的活动的onPause()
方法中:
handler.removeCallbacks(mRunnable);
为了获得额外的健壮性,在runnable本身内部,您应该仅在活动仍处于活动状态时才对runnable重新排队。因此,不是这样:
handler.postDelayed(mRunnable,1000);
您应该这样做(假设此代码位于activity类中):
if (!isDestroyed()) {
handler.postDelayed(mRunnable,1000);
}
另外,请确保在活动被销毁之前停止媒体播放器。
附注:如果您多次调用initializeSeekBar()
,您将重新分配mRunnable
,并将旧的保留在处理程序队列中,因为它可能会在以后造成麻烦。要解决此问题,您应该在initializeSeekBar()
的开头添加以下内容
protected void initializeSeekBar(){
if (mRunnable != null) {
handler.removeCallbacks(mRunnable);
}
// ... the rest of the method that you currently have
https://stackoverflow.com/questions/52337470
复制相似问题