Чтобы обновить панель поиска, я использую следующий код: Моя проблема заключается в том, что в любое время seekBar.setProgress() является вызовом, другой элемент в пользовательском интерфейсе становится зависающим, поэтому я хотел бы иметь другой поток, который обновляет seekBar в главном нить.
Как действовать?
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
try {
int pos;
switch (msg.what) {
case SHOW_PROGRESS:
pos = setProgress();
if (!mDragging && mBoundService.isPlaying()) {
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 100 - (pos % 1000));
}
break;
}
} catch (Exception e) {
}
}
};
private int setProgress() {
if (mBoundService == null || mDragging) {
return 0;
}
int position = mBoundService.getCurrentPosition();
int duration = mBoundService.getDuration();
if (sliderSeekBar != null) {
if (duration > 0) {
// use long to avoid overflow
long pos = 1000L * position / duration;
sliderSeekBar.setProgress((int) pos);
}
}
if (sliderTimerStop != null)
sliderTimerStop.setText(stringForTime(duration));
if (sliderTimerStart != null)
sliderTimerStart.setText(stringForTime(position));
return position;
}
Действия имеют метод runOnUiThread
который позволяет отдельным потокам обновлять компоненты пользовательского интерфейса. Ваш метод setProgress
будет выглядеть следующим образом:
private int setProgress() {
if (mBoundService == null || mDragging) {
return 0;
}
final int position = mBoundService.getCurrentPosition();
final int duration = mBoundService.getDuration();
runOnUiThread(new Runnable(){
@Override
public void run(){
if (sliderSeekBar != null) {
if (duration > 0) {
// use long to avoid overflow
long pos = 1000L * position / duration;
sliderSeekBar.setProgress((int) pos);
}
}
if (sliderTimerStop != null)
sliderTimerStop.setText(stringForTime(duration));
if (sliderTimerStart != null)
sliderTimerStart.setText(stringForTime(position));
}
});
return position;
}