2016-10-02 53 views
0

我正在制作音频播放器应用程序,我希望能够刷新显示当前播放位置的搜索栏和显示时间的文本视图。我能够做到这一点,但有一个问题。当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); 
} 

}

回答

1

我能解决这个问题。我没有使用seekbar的OnSeekBarChangeListener中的fromUser布尔值来防止以编程方式设置进度时调用它。无论何时进展正在更新,它正在寻找mediaPlayer并因此而滞后。

+0

您救了我的夜晚男人! –

0

这是我做到了我的应用程序,它运行没有任何滞后,我的代码转换毫秒到分秒不使用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条件的时间单位转换 –