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

Is SoundPool.load() designed to load asynchronously?

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

它的要点是许多开发人员,包括我自己,以前在 UI 线程中调用了 SoundPool.load(),这在 Android 的早期版本中运行良好,但是从 Lollipop 使用 SoundPool.load().

加载小声音时,似乎有十分之一秒的延迟

我没有在 Android 文档中找到任何暗示 SoundPool.load() 会异步加载声音的参考资料,但是 Android 早期版本中的行为和存在的 OnLoadCompleteListener 将暗示这一点(否则听众有什么意义?)

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

如果你有任何 VCS 控件,你应该修补或创建一个临时修复,当错误被修复时,只需恢复你的更改。

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

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

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

load() 调用本机 _load() 方法,该方法等同于 android_media_SoundPool.cpp

中的 android_media_SoundPool_load_FD

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

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