Android在音频播放器中刷新Seekbar进度和播放持续时间导致音频播放滞后

Posted

技术标签:

【中文标题】Android在音频播放器中刷新Seekbar进度和播放持续时间导致音频播放滞后【英文标题】:Android refreshing Seekbar progress and playback duration in audio player causing lags in audio playback 【发布时间】: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);

【问题讨论】:

【参考方案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条件的时间单位转换

以上是关于Android在音频播放器中刷新Seekbar进度和播放持续时间导致音频播放滞后的主要内容,如果未能解决你的问题,请参考以下文章

seekbar属性设置

AndroidAndroid开发实现进度条效果,SeekBar的简单使用。音量,音乐播放进度,视频播放进度等

Android seekbar使用

Android之SeekBar的简单使用

SeekBar(拖动条)

Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)