我正在尝试使用 SeekBar 来显示 MediaPlayer 类播放的曲目的长度并在曲目中启用搜索。
在轨道内寻找效果很好。但是,在播放曲目时使用 setProgress 更新进度值似乎会导致轻微的跳过。
在 onCreate 方法中,我创建了一个带有循环的线程,该循环更新当前轨道的 SeekBar 进度值。当轨道改变时,这个循环会重置。
private void createProgressThread() {
_progressUpdater = new Runnable() {
@Override
public void run() {
//Exitting is set on destroy
while(!_exitting) {
_resetProgress = false;
if(_player.isPlaying()) {
try
{
int current = 0;
int total = _player.getDuration();
progressBar.setMax(total);
progressBar.setIndeterminate(false);
while(_player!=null && current<total && !_resetProgress){
try {
Thread.sleep(1000); //Update once per second
current = _player.getCurrentPosition();
//Removing this line, the track plays normally.
progressBar.setProgress(current);
} catch (InterruptedException e) {
} catch (Exception e){
}
}
}
catch(Exception e)
{
//Don't want this thread to intefere with the rest of the app.
}
}
}
}
};
Thread thread = new Thread(_progressUpdater);
thread.start();
}
理想情况下,我宁愿不使用线程,因为我知道这有缺点。另外请原谅异常吞咽 - 很难继续检查所有 MediaPlayer 状态以响应 UI 事件。但是,我真正的问题是音乐正在跳过。
谁能建议一种替代方法来更新进度并解释为什么即使使用单独的线程,对 setProgress 的调用也会导致轨道跳过?
提前致谢。