I ' m пытается использовать 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 вызывает пропуск дорожки даже при использовании отдельного потока?
Заранее благодарим.