2013-07-03 93 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[][],那麼如何才能讓我的主Activity獲取數組?我已經研究過,發現你可以用onPostExecute()來改變UI,並且我已經看到了一些返回字符串的方法(但我並不完全理解),但不是像我的那樣的array[][]

我的另一個問題是,一旦我加載了SoundPool聲音,那麼另一個SoundPool可以讀取它們嗎?我不確定這些聲音是否實際加載到SoundPool本身,或者只是創建爲一個整數,當調用play()方法時可讀。如果沒有,那麼看起來我必須同時返回一個SoundPool和一個數組才能工作。如果有人可以給我一些真實的代碼示例來解釋這個東西,那將不勝感激。

至於我在doInBackground()方法中的實際代碼,它只包含上面第一個和第三個塊中顯示的代碼,以及創建一個SoundPool。另外,抱歉,如果有任何明顯的我做錯了/不到這裏,因爲我是新來的Java,這是我的第一個問題在StackOverflow。請讓我知道是否有任何其他信息需要您更好地回答此問題。

+0

嘗試'AsyncTask <無效,無效,列表>' –

回答

0

我建議你創建一個回調接口以及您與您實現活動,然後有這個回調類的一個實例爲您AsyncClass一個變量。回調可以採用任何你想要的參數。這是一個常見的設計模式,並早已在這裏解釋:

android asynctask sending callbacks to ui

你的接口顯然會進行定製,以滿足您的需求,但是這是你一個很好的輪廓。

+0

謝謝一堆。我想我以前聽說過這個方法,但從來沒有看到它的一個好例子。 – faraaz

+0

我現在只有一個問題。當我的主要活動開始時,我如何在後臺開始下載?我寫道:'新的SoundDownloader(this).execute();'但它給了我一個錯誤,說構造函數SoundDownloader是未定義的。 – faraaz

+0

不再看到你的代碼我會猜測SoundDownloader是你的asyncTask類,並且你沒有寫出構造函數'SoundDownloader(Activity activity)'(或者任何構造函數)。因此,假定在運行時將使用默認的構造函數。你只需要明確地寫上面提到的構造函數。 - 讓我知道這是不是這樣,斯科特 – Scott

相關問題