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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:18:04