【问题标题】:Android refreshing Seekbar progress and playback duration in audio player causing lags in audio playbackAndroid在音频播放器中刷新Seekbar进度和播放持续时间导致音频播放滞后
【发布时间】:2017-02-10 17:18:11
【问题描述】:

我正在制作一个音频播放器应用程序,我希望能够刷新一个显示当前播放位置的搜索栏和一个显示时间的文本视图。我可以这样做,但有一个问题。当 seekbar 和 textview 更新的每一秒,音频都会有一个小的延迟。当视图更新时,它就像每秒暂停一小段时间一样。

这是我的更新程序类

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);
}

}

【问题讨论】:

    标签: android audio


    【解决方案1】:

    我能够解决问题。我没有在搜索栏的 OnSeekBarChangeListener 中使用布尔 fromUser 来防止在以编程方式设置进度时调用它。每当进度更新时,它都在寻找媒体播放器,因此会出现滞后。

    【讨论】:

      【解决方案2】:

      这就是我在我的应用程序中的做法,它运行时没有任何延迟,我的代码将毫秒转换为分钟和秒,而不使用 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);
      
                          }
                      });
                  }
                  }
      

      【讨论】:

      • 感谢没有if条件的时间单位转换
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      相关资源
      最近更新 更多