SoundPool.load() 是不是设计为异步加载?

Posted

技术标签:

【中文标题】SoundPool.load() 是不是设计为异步加载?【英文标题】:Is SoundPool.load() designed to load asynchronously?SoundPool.load() 是否设计为异步加载? 【发布时间】:2015-03-22 19:27:29 【问题描述】:

似乎有几个用户注意到SoundPool.load() 随着 Lollipop 的发布而倒退(here、here 和 here):

它的要点是,包括我自己在内的许多开发人员之前都在 UI 线程中调用了SoundPool.load(),这在早期版本的 android 中运行良好,但从 Lollipop 来看,似乎延迟了十分之一使用SoundPool.load() 加载小声音时的秒数。

我在 Android 文档中没有发现任何引用表明 SoundPool.load() 会异步加载声音,但是,早期版本的 Android 中的行为和 OnLoadCompleteListener 的存在会暗示这一点(否则成为听众的重点?)

我的问题是:SoundPool.load() 是否应该异步加载声音,我可以按照这个设计,并期望这个问题得到解决,还是应该开始将此代码放入 AsyncTask 或其他后台线程机制中?

【问题讨论】:

【参考方案1】:

如果您有任何 VCS 控制,您应该修补或创建临时修复,当错误修复后,只需恢复您的更改。

我不会让它保持原样,即使这个问题是在谷歌方面,也不要冒险给你的用户体验带来风险,修补它并在修复后恢复它。

【讨论】:

我意识到这个负担不应该转嫁给用户。我有兴趣了解 SoundPool.load() 的预期使用模式。 如果没有代码,我无法确定您尝试执行的操作是否正常,但这是 Lollipop 的一个已知问题,这是 google 方面的一个错误,所以如果它在过去,一旦解决,您应该保持相同的“模式”。【参考方案2】:

异步并不一定意味着在后台线程上运行

SoundPool.load() 显然是异步运行的。问题是它是在调用线程(通常是主线程)上运行,还是在单独的线程上运行。

load() 调用原生 _load() 方法,相当于android_media_SoundPool.cpp 中的 android_media_SoundPool_load_FD

按照从那里开始的逻辑进入SoundPool.cpp、SoundPool.h 和SoundPoolThread,虽然我不太精通 C++,但似乎很清楚它在后台线程上执行实际工作。

在某些设备上加载声音确实需要很长时间(在小型 LGE tracfone 上需要 20 多秒,但在更现代的三星 S6 上则不到 1 秒),因此在以下情况下向用户显示进度动画可能是合适的声音无法提前加载。

【讨论】:

以上是关于SoundPool.load() 是不是设计为异步加载?的主要内容,如果未能解决你的问题,请参考以下文章

将音频文件流式传输到 soundpool load() Android

如何在 soundPool (Android) 中逐渐加载声音?

如何停止 SoundPool 中的所有声音?

如何停止通过 Soundpool 播放声音?

单击按钮时如何发出随机声音?

Xamarin.Android 使用SoundPool进行音频播放