React Native退后台崩溃:Unable to pause activity与ConcurrentModificationException
看起来你碰到的是react-native-audio-toolkit在Android端切后台时的并发修改崩溃问题,我帮你拆解下问题和解决方案:
问题根源分析
从崩溃日志里能看到核心错误是java.util.ConcurrentModificationException,发生在AudioPlayerModule.java:64的onHostPause方法里。这个方法的作用是当应用切后台时,遍历所有已创建的播放器实例去执行暂停操作,但因为原生模块用普通HashMap存储播放器,同时可能有其他线程(比如播放器的回调线程)在修改这个集合,遍历过程中集合被修改就触发了这个异常。
前面的MediaPlayerNative: pause called in state 8这类错误是连带问题——播放器状态不对(比如已经被释放)时调用pause/getDuration导致的,但真正让应用崩溃的是并发修改异常。
解决方案
方案1:修改原生模块代码(彻底解决)
如果你能修改react-native-audio-toolkit的Android原生代码,找到AudioPlayerModule.java里的onHostPause方法,把遍历播放器集合的逻辑改成安全遍历的方式:
@Override public void onHostPause() { // 复制一份播放器集合,避免遍历原集合时被并发修改 List<AudioPlayer> playerList = new ArrayList<>(this.players.values()); for (AudioPlayer player : playerList) { try { if (player.isPlaying()) { // 先判断状态,避免无效调用 player.pause(); } } catch (Exception e) { // 捕获所有异常,防止单个播放器的问题导致整个应用崩溃 Log.e(TAG, "Error pausing player", e); } } }
或者更彻底一点,把存储播放器的HashMap换成ConcurrentHashMap,它本身支持并发场景下的安全遍历。
方案2:在RN层面提前处理(无需改原生)
通过监听AppState,在应用切后台时手动暂停并释放所有播放器,抢在原生模块的onHostPause执行前清理资源:
import { AppState } from 'react-native'; import { Player } from 'react-native-audio-toolkit'; // 全局保存所有创建的播放器实例 const activePlayers = []; // 封装创建播放器的方法,自动加入数组 export const createAudioPlayer = async (audioPath) => { const player = new Player(audioPath); await player.prepare(); activePlayers.push(player); return player; }; // 监听AppState变化 AppState.addEventListener('change', async (nextState) => { if (nextState === 'background') { // 遍历并清理所有播放器 for (const player of activePlayers) { try { if (player.isPlaying) { await player.pause(); } await player.release(); // 释放资源,避免原生端持有无效实例 } catch (err) { console.warn('Failed to clean up player:', err); } } // 清空数组 activePlayers.length = 0; } });
这样原生模块在onHostPause时,已经没有活跃的播放器实例需要处理,自然不会触发并发修改的问题。
方案3:升级模块版本
先检查react-native-audio-toolkit的最新版本,看看官方有没有修复这个后台崩溃的bug,如果有的话直接升级依赖即可:
npm install react-native-audio-toolkit@latest --save # 或者用yarn yarn upgrade react-native-audio-toolkit@latest
内容的提问来源于stack exchange,提问作者Ketan Malhotra

