Sound Pool и Hash Map

У меня есть около 100 аудиофайлов в необработанной папке, эти 100 файлов просто говорят числа от 1 до 100.

После того, как я нажму на кнопку. Я хочу, чтобы он воспроизводил число в соответствии с текстом, введенным в текстовое поле.

Поэтому я использую звуковой пул и хеш-карту. Это работает просто отлично без каких-либо проблем

soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 100);
soundsMap = new HashMap<Integer, Integer>();
soundsMap.put(1, soundPool.load(this, R.raw.number1, 1));
soundsMap.put(2, soundPool.load(this, R.raw.number2, 1)); 

как указано выше до номера 100. Я получаю значение текстового поля

Я поставил цикл for от 1 до 100. какое бы значение ни было воспроизведено.

используя soundPool.play(1,....)

Это работает просто отлично без каких-либо проблем.

Но странная вещь в том, что, поскольку он создает haspmap со значением 100 ... есть 5-секундная задержка и пустой экран, и я ничего не могу сделать с происходящим процессом.

Есть ли способ просто создать хэш-карту в соответствии со значением и воспроизвести звук.

Как сказать, например,

Если текстовое поле имеет значение 20

in the for loop: i=1 to 100..
it should get the value 20:
string a = "R.raw.number"+i
SoundsMap.put(1, soundPool.load(this, a, 1));
soundPool.play(1,....)

если выше возможно... Как мне это сделать?

Ждем вашего ответа! Спасибо!


person TheDevMan    schedule 07.06.2012    source источник
comment
Я не уверен, почему вы думаете, что это странно. Вы загружаете 100 аудиофайлов. Это требует времени. Вы можете сделать это в фоновом потоке (возможно, используя AsyncTask) и отображать индикатор выполнения во время загрузки. Я не понимаю, для чего вы используете цикл for.   -  person kabuko    schedule 08.06.2012
comment
О боже, ты сто раз тестируешь if(editText.getText().equals(String.valueOf(i)))? Нонононо. Разберите ввод в число и идите оттуда. Проверьте мой пример ниже.   -  person Kevin Coppock    schedule 08.06.2012


Ответы (1)


Зачем инициализировать все в начале? Что, если пользователь никогда не нажимает больше нескольких кнопок? Я бы предложил загрузку при нажатии кнопки, что-то вроде этого:

//in onCreate()

final EditText editText = (EditText)findViewById(R.id.my_input_field);
int[] sounds = { R.raw.number1, R.raw.number2,
                 R.raw.number3, /*etc.*/ };

//in your onClick()

try {
    Double value = Double.parseDouble(editText.getText());
    int soundId = soundPool.load(MyActivity.this, sounds[value - 1], 1);
    soundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
} catch (NumberFormatException e) {
    //Alert the user that an invalid number was entered
}
person Kevin Coppock    schedule 07.06.2012
comment
Спасибо... Этот код работал, за исключением того, что мне пришлось поставить onLoadListener с условием if. Спасибо за вашу помощь! :) - person TheDevMan; 08.06.2012