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
相关产品推荐
相关产品推荐

