修复SimpleExoPlayer.stop()空对象引用与ViewPager滑动停播问题
修复ViewPager滑动时视频无法停止及空指针异常问题
问题原因
空指针异常是因为你调用SimpleExoPlayer.stop()的对象为null——如果simpleExoPlayer1是局部变量,在ViewPager滚动监听触发时,该变量可能已经被销毁或未完成初始化。而滑动时无法停止视频,核心是没有持有当前正在播放的Player实例,无法在页面切换时对其进行控制。
修复步骤
- 将Player声明为MainActivity全局变量
在MainActivity类中定义全局变量,用于持有当前正在播放的Player实例:
public class MainActivity extends AppCompatActivity { // 全局变量,持有当前播放的Player private SimpleExoPlayer currentPlayer; // 其他代码... }
- 在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方法... }
- 修改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(); } } });
- 页面销毁时释放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
相关产品推荐
相关产品推荐

