Я пытаюсь использовать 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 в ответ на события пользовательского интерфейса.Однако моя настоящая проблема в том, что музыка пропускается.
Может ли кто-нибудь предложить альтернативный способ обновления прогресса и объяснить, почему вызов setProgress приводит к пропуску дорожки даже при использовании отдельного потока?
Заранее спасибо.