SeekBar在播放过程中不稳定

时间:2016-09-12 13:59:06

标签: java android audio view seekbar

基本上我正在使用搜索栏向用户显示音频播放的方式,我的视觉更新显示在Thread中,如下所示:

@Override
public void run() {
    while(mUpdating) {
        if(mSeekBar != null) {
            mSeekBar.setProgress(mAudioPlaybackManager.getCurrentPosition());
        }
        //Other stuff is updating
    }
}

因此,例如,如果用户播放长度为2500毫秒的音频,则此SeekBar最大值将为2500,并且每隔ms将更新

同样的代码在runOnUiThread中的工作速度要慢得多,所以我猜测什么时候会改变进度postInvalidate被称为

所以基本上每个ms,都应该改变搜索条的值。我想这就是问题所在。在我的设备Samsung J7上,它工作顺利,但在Samsung Galaxy S5它只是停止和跳跃,就像我将此代码放在runOnUIThread中一样,它会非常慢。

我该怎么做才能让它更顺畅?我可以用另一个View用于此目的吗?

当前SeekBar正在做的事情:

  • 基本上在while(updating)

  • 中显示音频进度
  • 当用户更改SeekBar音频的位置时,从该点开始。

1 个答案:

答案 0 :(得分:0)

线程是工作线程,而不是UI的线程,你正在操作线程中的UI组件,从而阻止了UI的线程。

如果您想更新搜索栏,请在UI的主题中更新它。可以使用UI的线程处理程序完成。

例如

private Runnable updateSeekBarTime = new Runnable() {
        public void run() {
            //get current position
            timeElapsed = mediaPlayer.getCurrentPosition();
            //set seekbar progress
            seekbar.setProgress((int) timeElapsed);

      //repeat yourself again in 100 miliseconds
        durationHandler.postDelayed(this, 100);
        }
    };

执行

public void play(View view) {

      mediaPlayer.start();

        while(mUpdating) {
           if(mSeekBar != null) {
             // post the Runnable (updateSeekBarTime)
             durationHandler.postDelayed(updateSeekBarTime, 100); 
          }
        }
    }

从用户的角度来看,也不能简单地每毫秒更​​新一次组件,不会注意到暂停。