java - java.lang.illegalStateException 当让 mediaPlayer.getCurrentPosition 和 SeekBar 在 Pause 时进入 Intial
问题描述
每次关闭 Activity 时,我都会在我的 Android 音乐播放器应用程序中收到 java.lang.IllegalStateException
mCurrentPosition = mediaPlayer.getCurrentPosition()/1000; // In milliseconds
我已经尝试了几乎所有可用的代码,甚至在获取 mediaPlayer.getCurrentPosition 时也会随机发生 java.lang.illegalStateException
这是我使用它的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);
}
解决方案
当活动关闭时(或者更好的是,当它暂停时),您需要从处理程序队列中删除您的可运行文件。尝试将其放入您的活动onPause()
方法中:
handler.removeCallbacks(mRunnable);
为了获得额外的健壮性,在可运行对象本身内部,您应该仅在活动仍处于活动状态时重新排队可运行对象。所以代替这个:
handler.postDelayed(mRunnable,1000);
你应该这样做(假设这段代码在活动类中):
if (!isDestroyed()) {
handler.postDelayed(mRunnable,1000);
}
还要确保在销毁活动之前停止媒体播放器。
PS如果您initializeSeekBar()
多次调用,您将重新分配mRunnable
并将旧的留在处理程序队列中,以后可能会造成麻烦。要解决这个问题,你应该在开头添加这个initializeSeekBar()
:
protected void initializeSeekBar(){
if (mRunnable != null) {
handler.removeCallbacks(mRunnable);
}
// ... the rest of the method that you currently have
推荐阅读
- android - 通过通知侦听器服务从通知中提取图像
- c++ - 我重载了一个虚函数,但它不起作用
- ruby-on-rails - 在 Rails 中,悲观锁定如何跨请求工作?
- c# - openfileDialog.OpenFile 方法在命名空间 System.Windows.Forms 中的作用是什么
- python - 在 ProcessPoolExecutor 中杀死进程
- php - 选择时的mysql下拉列表
- java - Spark:聚合总和不正确
- pact - 使用 PactContractConverter 生成 Pact 文件的问题
- laravel - 查找两个不同纬度之间的半径?
- tableau-api - 我们可以在画面中动态隐藏/取消隐藏度量列而不创建多个工作表吗?