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

Just_audio中ConcatenatingAudioSource持续加载无响应致应用崩溃问题

问题根因

该报错来自just_audio内部维护的播放队列元数据数据库,0.9.30及以上版本默认开启了全量AudioSource元数据预写入逻辑,你一次性批量加载几十上百个AudioSource时,会触发长事务阻塞数据库操作,最终导致数据库锁警告、UI无响应。

可落地解决方案

  • 方案1:禁用元数据预缓存(优先采用,改造成本最低)
    构造AudioSource时主动关闭预缓存开关,同时将你的自定义_mediaItem存入tag属性,后续需要元数据时直接从tag读取,不用走内部数据库查询:

    ConcatenatingAudioSource(
      children: _mediaItems
          .map((item) => AudioSource.uri(
              Uri.parse(item.id),
              precache: false,
              tag: item,
            ))
          .toList(),
      initialIndex: startIndex,
      initialPosition: pos >= _mediaItems[startIndex].duration
          ? Duration(seconds: 0)
          : pos
    );
    

    调整后加载100+首歌的速度和旧版本一致,不会触发数据库锁问题。

  • 方案2:用懒加载队列替代全量加载
    如果业务需要预加载元数据,不要一次性全量塞入队列,改用LazyConcatenatingAudioSource实现按需加载:仅提前加载当前播放位置前后3-5首音频,剩下的音频等播放进度快触达时再动态插入队列,从根源上减少单次数据库操作的量级。

  • 方案3:将初始化逻辑移至后台线程
    若必须保留全量预加载逻辑,把ConcatenatingAudioSource的初始化操作放到Isolate或compute中执行,不要占用主UI线程,初始化完成后再将实例赋值给播放器,避免UI卡死。

  • 临时兼容方案
    若近期升级过just_audio版本,可先回退到0.9.29版本,该版本未开启默认全量元数据写入逻辑,可直接恢复之前的加载性能。


内容的提问来源于stack exchange,提问作者Intellect

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:03