Ответ 1
Только так вы, ребята, знаете, это известная ошибка:
- https://code.google.com/p/android-developer-preview/issues/detail?id=1812
- https://code.google.com/p/android/issues/detail?id=81187
Я пробовал многопоточность... Он работает нормально в некотором смысле, что он не блокирует приложение! Но вам нужно знать, что вы не можете вызвать метод Soundpool.load перед загрузкой всех ваших звуков. Даже если вы вызываете нагрузку на уже загруженный звук, это приводит к зависанию приложения. Я думаю, что класс SoundPool имеет какую-то внутреннюю синхронизацию. В любом случае, вы можете сделать свою работу с помощью этого метода. Это своего рода фрагмент, который может помочь:
private class loadSFXasync extends AsyncTask<String, Integer, Long> {
protected Long doInBackground(String... str) {
int count = str.length();
long totalSize = 0;
for (int i = 0; i < count; i++) {
mSoundPool.load(str,1);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
mAllSoundsAreLoaded=true;
}
}
и в вашем коде:
playSound(String str){
if (!mAllSoundsAreLoaded)
return;
// otherwise: do mSoundPool.load(....)
}