Android幻灯片页点击按钮跳转Activity时应用崩溃如何解决
核心崩溃原因
你写的mainMenu()方法存在致命逻辑错误,90%场景崩溃是因为触发了空指针异常:
你在方法内部声明了一个值为null的MediaPlayer局部变量,这个变量和你实际用来播放幻灯片音效的MediaPlayer实例没有任何关联,直接调用mediaPlayer.stop()本质是在空对象上调方法,系统会直接抛出NullPointerException终止应用。仅在极少数内存状态异常的巧合场景下,这个调用没有触发崩溃,才会走到后续跳转逻辑,完全不是代码逻辑正确导致的正常运行。
除此之外还有两个潜在隐患会加剧崩溃概率:
- 调用MediaPlayer方法前没有做状态校验,即便拿到了正确的播放实例,若播放器处于已释放、未初始化等非法状态,直接调
stop()也会抛出状态异常 - 用来做幻灯片5秒切换的Handler没有和页面生命周期绑定,点击跳转后待执行的切页、播音效任务还在消息队列里,后台执行时会因为页面已销毁触发各类异常
修复方案
按以下步骤调整代码即可实现预期效果:
- 将MediaPlayer、负责幻灯片切换的Handler定义为当前Activity的全局成员变量,不要在播放音效、切幻灯片的方法内将其声明为局部变量,保证整个页面生命周期内能访问到同一个工作实例
- 点击按钮触发跳转前,先清空Handler队列里所有待执行的延时任务,避免后台残留任务执行
- 操作MediaPlayer前先做非空判断、状态校验,捕获可能出现的状态异常,停止播放后及时释放资源
- 所有资源清理完成后再执行页面跳转逻辑
修复后的参考代码如下:
// 以下两个变量要定义在Activity类下,作为全局成员,不要写在方法内部 private MediaPlayer slideMediaPlayer; private Handler slideSwitchHandler = new Handler(Looper.getMainLooper()); public void mainMenu() { // 第一步:清空所有待执行的幻灯片切换延时任务 slideSwitchHandler.removeCallbacksAndMessages(null); // 第二步:安全停止并释放音频资源 if (slideMediaPlayer != null) { try { if (slideMediaPlayer.isPlaying()) { slideMediaPlayer.stop(); } slideMediaPlayer.release(); slideMediaPlayer = null; } catch (IllegalStateException e) { // 捕获播放器状态异常,避免崩溃 e.printStackTrace(); } } // 第三步:执行页面跳转 startActivity(new Intent(getApplicationContext(), TableOfContents.class)); // 若跳转后不需要返回当前幻灯片页,可结束当前Activity减少内存占用 finish(); }
注意:后续切换幻灯片更换播放音效时,新建MediaPlayer实例后一定要赋值给全局的slideMediaPlayer变量,不要在播放方法里定义同名局部变量,否则全局变量拿不到有效实例还是会触发空指针。
内容的提问来源于stack exchange,提问作者Ramon Akoto
相关产品推荐
相关产品推荐

