2013-07-03 68 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

相关问题