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

Head First Kotlin鼓机代码注释Thread.sleep后音频仅播放一次问题

问题根因

这个问题和代码逻辑本身无关,核心是playSound函数的音频播放特性以及主线程执行速度导致的:

  • 绝大多数音频播放API默认是异步执行的:调用playSound()之后不会阻塞当前线程等待音频播放完成,而是立刻返回,在后台启动播放任务。
  • 常规音频播放实现只会复用同一个播放器实例:短时间内多次调用播放方法时,新的播放请求会直接中断正在播放的音频,从头开始播放新的请求。

有Thread.sleep时的执行逻辑

你传入的节奏串是x-x-x-x-x-x-(共14个字符,包含7个x),调用split("x")后会得到8个元素:["", "-", "-", "-", "-", "-", "-", "-"]
每次循环执行到playSound前都会先sleep对应时长,两次播放的间隔至少有200ms,足够本次音频播放完成,不会被下一次调用打断,所以你能听到连续的7次鼓点。

注释掉sleep后的执行逻辑

整个for循环会在10ms以内的极短时间内全部执行完毕,相当于瞬间连续调用了7次playSound:

  1. 第一次调用playSound开始播放音频
  2. 立刻触发第二次调用,中断第一次播放,重新开始
  3. 第三次调用又中断第二次,以此类推
  4. 直到最后一次调用playSound后没有新的播放请求,这次音频才会完整播放完毕

所以你最终只会听到1次播放的声音,本质是前6次播放都被后续请求直接打断了。


可选修复方案

如果不想用Thread.sleep阻塞主线程,可以选择两种改造方式:

  • 用Kotlin协程的delay替代sleep,既可以实现播放间隔,也不会阻塞主线程
  • 每次调用playSound时创建独立的播放器实例,避免新请求中断旧播放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:09:04