Android刷新Seekbar在音频播放器中的进度和播放持续时间导致音频播放滞后
问题描述:
我正在制作音频播放器应用程序,我希望能够刷新显示当前播放位置的搜索栏和显示时间的文本视图。我能够做到这一点,但有一个问题。当seekbar和textview更新时,每秒都有一个音频滞后。就好像它在视图更新时每秒暂停一小段时间。Android刷新Seekbar在音频播放器中的进度和播放持续时间导致音频播放滞后
这里是我Updater类
import android.os.Handler;
import android.os.Looper;
import java.util.concurrent.TimeUnit;
class refreshSeekBar extends Thread{
private Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
public void run() {
startRefreshingSeekBar();
}
private void startRefreshingSeekBar(){
Global.scheduledFuture = Global.scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
long S = Global.mediaPlayer.getCurrentPosition();
S = S/1000;
long M = S/60;
S = S%60;
String SS = ""+S;
String MM = ""+M;
if((S/10)<1){
SS = "0"+SS;
}
if((M/10)<1){
MM = "0"+MM;
}
final String MMM = MM;
final String SSS = SS;
mainHandler.post(new Runnable() {
@Override
public void run() {
Global.seekBar.setProgress(Global.mediaPlayer.getCurrentPosition());
Global.textCurrentDuration.setText(MMM+":"+SSS);
}
});
}
},0,1000, TimeUnit.MILLISECONDS);
}
}
答
我能解决这个问题。我没有使用seekbar的OnSeekBarChangeListener中的fromUser布尔值来防止以编程方式设置进度时调用它。无论何时进展正在更新,它正在寻找mediaPlayer并因此而滞后。
答
这是我做到了我的应用程序,它运行没有任何滞后,我的代码转换毫秒到分秒不使用if语句。
@Override
public void run() {
currentPosition = mPlayer.getCurrentPosition();
total = mPlayer.getDuration();
while (mPlayer != null && currentPosition < total) {
try {
Thread.sleep(1000);
currentPosition = mPlayer.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
seekBar.setProgress(currentPosition);
runOnUiThread(new Runnable() {
@Override
public void run() {
// This code will always run on the UI thread, therefore is safe to modify UI elements.
String currTime = String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(currentPosition),
TimeUnit.MILLISECONDS.toSeconds(currentPosition) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(currentPosition))
);
currentPos.setText(currTime);
}
});
}
}
+0
感谢没有if条件的时间单位转换 –
您救了我的夜晚男人! –