Android中abandonAudioFocus触发NullPointerException问题咨询
为什么第二段代码会触发NullPointerException?
咱们直接拆解两段代码的核心差异,就能找到问题根源了。
先看你的两段代码:
第一段(运行正常)
private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener); } }
第二段(触发空指针)
private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener); }
关键区别就在mAudioManager.abandonAudioFocus(...)的执行时机:
- 第一段里,这个方法只有在
mMediaPlayer不为null的时候才会被调用——这意味着此时mAudioManager大概率处于有效状态(毕竟之前能初始化并使用mMediaPlayer,说明音频管理器是正常可用的)。 - 第二段里,这个方法不管
mMediaPlayer是否为null,都会强制执行。当mMediaPlayer为null时,很可能mAudioManager已经被提前释放或者从未初始化过(比如你在其他逻辑里把它置为null了),这时候直接调用它的方法,自然就会抛出java.lang.NullPointerException。
简单说:第二段代码没有确保mAudioManager在调用方法时是一个非null的有效对象。
修复方案
你有两种安全的选择:
- 保留第一段的逻辑:只有当
mMediaPlayer存在时才释放音频焦点(毕竟只有获取过媒体播放器,才可能请求过音频焦点,需要释放)。 - 给第二段的
abandonAudioFocus调用加一个非空判断,确保调用安全:
private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } // 先判断mAudioManager是否有效,再执行释放操作 if (mAudioManager != null) { mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener); } }
内容的提问来源于stack exchange,提问作者Keng Shing Aw
相关产品推荐
相关产品推荐

