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

标签 android multithreading soundpool

似乎有几个用户已经注意到 SoundPool.load()随着 Lollipop 的发布( hereherehere )而有所退步:

其要点是,包括我自己在内的许多开发人员之前都曾调用过 SoundPool.load()在 UI 线程中,该线程在 Android 的早期版本中运行良好,但从 Lollipop 开始,使用 SoundPool.load() 加载小声音时似乎存在十分之几秒的延迟。 .

我在 Android 文档中没有找到任何表明 SoundPool.load() 的引用会异步加载声音,但是,早期版本的 Android 中的行为以及 OnLoadCompleteListener 的存在会暗示这一点(否则对听众来说还有什么意义?)

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

最佳答案

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

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

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

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

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

关于android - SoundPool.load() 是否设计为异步加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29198850/

相关文章:

Ruby 和 Redis,线程不处理命令

android - SoundPool类型的方法load(Context,int,int)不适用,方法getSystemService(String)未定义

java - gson 未终止的字符串错误

android - 致命异常 : main 03-26 > 13:09:15. 145 : E/AndroidRuntime(389): java. lang.RuntimeException: > 无法启动 Activity

c# - 有 Form.Invoke() 方法吗?

c# - 如何在 C# 中为构造函数使用多线程

java - 我的 soundpool 项目无法正常播放?

android - 播放特定时间的音频文件

java - 在android中查找触摸事件之间的持续时间

java - getIntent() 返回空指针异常