2013-07-03 4 views
0

Я потратил немало времени на изучение этого онлайн. Однако мне не удается заставить мою Asynctask загружать звуки SoundPool в фоновом режиме. У меня есть 54 звуков, и я загружаю их, как это:Как использовать Asynctask для загрузки звуков SoundPool?

int selectHello[] = new int[4]; 
selectHello[0] = sp.load(this, R.raw.hello1a, 1); 
selectHello[1] = sp.load(this, R.raw.hello2a, 1); 
selectHello[2] = sp.load(this, R.raw.hello3a, 1); 
selectHello[3] = sp.load(this, R.raw.hello4a, 1); 
//and so on, 10 more times with different sounds 

Мне нужно, чтобы загрузить их внутри массивов, потому что я использую рандомизации случайным образом выбрать один из 4 (или около того) после нажатия на кнопку. Моя рандомизер выглядит следующим образом:

private void playSound(int id) { 
// TODO Auto-generated method stub 
    int high = playList[id].length-1; 
    int randomNum; 
    do { 
     randomNum = (int)(Math.random()*(high-0+1))+0; 
    } while (randomNum == previousNum); 
    previousNum = randomNum; 
    sp.play(playList[id][randomNum], 1, 1, 0, 0, 1); 
} 

Я создал int playList[][], который представляет собой массив из загруженных массивов (например, selectHello[]), чтобы сделать его чище/проще найти, какой звук мне нужно.

int playList[][]; 
playList = {selectHello, ...etc}; 
//And so on, 10 more times 

Когда я использую метод doInBackground(), это позволяет мне вернуться на 1 пункт, и поэтому я пытался вернуть playList[][], который является массивом загруженных массивов. У меня есть два вопроса. Во-первых, если я должен был вернуть playList[][], то как я могу получить свою основную активность для получения массива? Я исследовал, что вы можете изменить пользовательский интерфейс с помощью onPostExecute(), и я видел некоторые способы (которые я не совсем понимаю) вернуть строки, но не array[][], как у меня.

Мой другой вопрос в том, что как только я загрузил звуки SoundPool, может ли другой SoundPool их прочитать? Я не уверен, действительно ли звуки загружаются непосредственно в SoundPool или просто создаются в целое число, которое можно прочитать при вызове метода play(). Если нет, то, похоже, мне придется возвращать SoundPool и массив для работы моего кода. Если бы кто-то мог дать мне примеры реальных примеров, объясняющих этот материал, он был бы весьма признателен.

Что касается моего фактического кода в методе doInBackground(), он состоит только из кода, показанного в первом и третьем блоках выше, и создания SoundPool. Кроме того, извините, если есть что-то очевидное, что я делаю неправильно/не получаю здесь, потому что я новичок в Java, и это мой первый вопрос в StackOverflow. Пожалуйста, дайте мне знать, если вам нужна другая информация, чтобы лучше ответить на этот вопрос.

+0

try 'AsyncTask >' –

ответ

0

Я предлагаю вам создать интерфейс обратного вызова и реализовать его с вашей деятельностью, а затем иметь экземпляр этого класса обратного вызова в качестве переменной в вас AsyncClass. Обратный вызов может принимать любые параметры, которые вы хотите. Это общий шаблон дизайна и уже хорошо объяснено здесь:

android asynctask sending callbacks to ui

Ваш интерфейс, очевидно, будет настроен, чтобы удовлетворить ваши потребности, но это хороший план для вас.

+0

Спасибо, кучка. Я думаю, что раньше слышал об этом методе, но так и не смог увидеть хороший пример этого. – faraaz

+0

У меня сейчас еще один вопрос. Как начать загрузку в фоновом режиме, когда начнется моя основная деятельность? Я написал: 'new SoundDownloader (this) .execute();' но это дает мне ошибку, говоря, что конструктор SoundDownloader не определен. – faraaz

+0

Не видя больше вашего кода, я бы предположил, что SoundDownloader - ваш класс asyncTask и что вы не написали конструктор 'SoundDownloader (Activity activity)' (или какой-либо конструктор, если на то пошло). Поэтому предполагается, что во время выполнения будет использоваться конструктор по умолчанию. Вам просто нужно явно написать упомянутый выше конструктор. - Дайте мне знать, если это не так, Скотт – Scott