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

修复SimpleExoPlayer.stop()空对象引用与ViewPager滑动停播问题

修复ViewPager滑动时视频无法停止及空指针异常问题

问题原因

空指针异常是因为你调用SimpleExoPlayer.stop()的对象为null——如果simpleExoPlayer1是局部变量,在ViewPager滚动监听触发时,该变量可能已经被销毁或未完成初始化。而滑动时无法停止视频,核心是没有持有当前正在播放的Player实例,无法在页面切换时对其进行控制。

修复步骤

  1. 将Player声明为MainActivity全局变量
    在MainActivity类中定义全局变量,用于持有当前正在播放的Player实例:
public class MainActivity extends AppCompatActivity {
    // 全局变量,持有当前播放的Player
    private SimpleExoPlayer currentPlayer;

    // 其他代码...
}
  1. 在Adapter的ViewHolder中更新全局Player实例
    当ViewHolder绑定视频并初始化Player后,将该Player实例赋值给MainActivity的全局变量。如果Adapter是MainActivity的内部类,可直接访问;如果是独立类,可通过接口回调或构造传参的方式传递:
// 假设Adapter是MainActivity的内部类
public class VideoPagerAdapter extends PagerAdapter {
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View itemView = LayoutInflater.from(container.getContext()).inflate(R.layout.item_video, container, false);
        SimpleExoPlayer player = new SimpleExoPlayer.Builder(container.getContext()).build();
        // 绑定播放器到View、设置媒体源等操作...
        
        // 更新MainActivity的全局Player
        MainActivity.this.currentPlayer = player;
        
        container.addView(itemView);
        return itemView;
    }

    // 其他Adapter方法...
}
  1. 修改ViewPager滚动监听,停止当前播放
    在滚动监听中,判断全局Player不为空时调用stop(),可根据场景选择在滑动开始或页面切换完成时执行:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    @Override
    public void onPageSelected(int position) {
        // 页面切换完成时停止之前的视频
        if (currentPlayer != null) {
            currentPlayer.stop();
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // 滑动开始时停止视频(可选,根据需求选择触发时机)
        if (state == ViewPager.SCROLL_STATE_DRAGGING && currentPlayer != null) {
            currentPlayer.stop();
        }
    }
});
  1. 页面销毁时释放Player资源
    在MainActivity的onDestroy()方法中释放Player,避免内存泄漏:
@Override
protected void onDestroy() {
    super.onDestroy();
    if (currentPlayer != null) {
        currentPlayer.release();
        currentPlayer = null;
    }
}

额外提示

如果使用Fragment作为ViewPager的页面,建议在Fragment的onPause()或onStop()方法中停止并释放Player,配合全局变量的控制,能更精准地管理播放器生命周期,避免多页面Player冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:20:55