You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MediaPlayer搭配ProgressBar更新问题:进度条无显示求助

Fixing ProgressBar Not Updating with MediaPlayer

Hey Florian, I get it—your MediaPlayer plays audio just fine, but that ProgressBar stays completely still. The issue here is straightforward: you’ve got playback working, but there’s no code to sync the ProgressBar with the current position of your audio. Let’s walk through how to fix this.

Why Isn’t the ProgressBar Moving?

Right now, your code only initializes and starts the MediaPlayer. The ProgressBar needs regular updates to reflect where you are in the audio track. Plus, any UI updates (like changing the ProgressBar’s progress) have to run on the main thread—you can’t update UI from a background thread directly.

Step-by-Step Solution

We’ll use a Handler to periodically fetch the MediaPlayer’s current position and update the ProgressBar. Here’s the complete, updated code:

private MediaPlayer mp;
private ProgressBar progressBar;
private Handler progressUpdateHandler = new Handler();
private Runnable progressUpdateRunnable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout);
    // 绑定你的ProgressBar控件
    progressBar = findViewById(R.id.your_progress_bar_id);

    File audioFile = // 替换成你的音频文件实例
    final Uri fileUri = Uri.fromFile(audioFile);
    mp = new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                mp.setDataSource(getApplicationContext(), fileUri);
                mp.prepare();
                
                // 设置ProgressBar的最大值为音频总时长(单位:毫秒)
                progressBar.setMax(mp.getDuration());
                
                mp.start();

                // 创建一个循环任务,每隔100ms更新一次进度
                progressUpdateRunnable = new Runnable() {
                    @Override
                    public void run() {
                        if (mp != null && mp.isPlaying()) {
                            // 获取当前播放位置
                            int currentPlaybackPosition = mp.getCurrentPosition();
                            // 更新ProgressBar(Handler确保操作在主线程)
                            progressBar.setProgress(currentPlaybackPosition);
                            // 100ms后再次执行,持续更新
                            progressUpdateHandler.postDelayed(this, 100);
                        }
                    }
                };
                // 启动进度更新
                progressUpdateHandler.post(progressUpdateRunnable);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

// 重要:在Activity销毁时清理资源,避免内存泄漏
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mp != null) {
        mp.stop();
        mp.release();
        mp = null;
    }
    // 移除Handler的循环任务,防止内存泄漏
    if (progressUpdateHandler != null && progressUpdateRunnable != null) {
        progressUpdateHandler.removeCallbacks(progressUpdateRunnable);
    }
}

Key Notes to Remember

  • Main Thread Rule: The Handler ensures we update the ProgressBar on the main thread—this is mandatory for all UI operations in Android.
  • Resource Cleanup: Always release the MediaPlayer and remove the Handler’s callbacks when your Activity is destroyed. This prevents memory leaks and unexpected behavior.
  • Edge Cases: The checks for mp != null and mp.isPlaying() prevent crashes if the MediaPlayer is stopped or released mid-playback.

内容的提问来源于stack exchange,提问作者Florian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:47:39