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

Android开发VideoView搭配SeekBar拖动滑块后控件失效问题求助

问题根源

你的updateSeekBar Runnable会每500ms自动更新SeekBar进度,而拖动SeekBar滑块时,onProgressChanged会连续触发videoView.seekTo(),两个操作频繁争夺SeekBar和VideoView的状态控制权,导致UI线程被大量重复回调占满,所以所有控件看起来像失灵了,本质是状态冲突而非代码抛出异常。

修复方案

1. 调整SeekBar拖动逻辑,拖动时暂停自动更新

修改OnSeekBarChangeListener,拖动开始时移除自动更新回调,结束拖动后再恢复更新,避免两者冲突:

SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        if (b) {
            videoView.seekTo(i*1000);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // 拖动开始时移除自动更新回调
        seekBar.removeCallbacks(updateSeekBar);
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // 拖动结束后恢复自动更新
        updateSeekBarProgress();
    }
};

2. 优化自动更新逻辑,减少无效操作

视频总时长只有加载完成后才会变化,不需要每次Runnable执行都重复设置setMax,修改逻辑如下:

// 修改updateSeekBar,移除重复setMax操作
private Runnable updateSeekBar = new Runnable() {
    @Override
    public void run() {
        seekBar.setProgress(videoView.getCurrentPosition() / 1000);
        seekBar.postDelayed(this,500);
    }
};

// 修改setVideoSource,等视频准备完成后再设置总时长
private void setVideoSource(Intent intent) {
    // ... 原有设置路径的代码 ...
    videoView.setOnPreparedListener(mp -> {
        // 视频准备完成后设置一次总时长即可,避免获取到无效值0
        seekBar.setMax(videoView.getDuration() / 1000);
        play();
        showController(controller);
        updateSeekBarProgress();
    });
}

3. 可选修复逻辑错误

你当前的快退/快进方法设置的是偏移1000毫秒=1秒,和方法名定义的10秒不符,可修改为:

private void forward_10_sec() {
    if (videoView.canSeekForward())
        videoView.seekTo(videoView.getCurrentPosition() + 10000);
}

private void reply_10_sec() {
    if (videoView.canSeekBackward())
        videoView.seekTo(videoView.getCurrentPosition() - 10000);
}

4. 额外优化避免内存泄漏

页面销毁时移除所有未执行的回调,避免内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (seekBar != null) {
        seekBar.removeCallbacks(updateSeekBar);
    }
    if (handler != null) {
        handler.removeCallbacksAndMessages(null);
    }
}

内容的提问来源于stack exchange,提问作者Ahmed Al-Ghanim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:21:00