Android 如何使用Asynctask加载声音池声音?

Android 如何使用Asynctask加载声音池声音?,android,android-asynctask,soundpool,Android,Android Asynctask,Soundpool,我花了很多时间在网上研究这个。但是,我无法让Asynctask在后台加载声音池声音。我有54种声音,我这样加载它们: 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); selectHel

我花了很多时间在网上研究这个。但是,我无法让Asynctask在后台加载声音池声音。我有54种声音,我这样加载它们:

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个(大约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[][]
,它是一个加载数组的数组。我有两个问题。首先,如果我要返回
播放列表[][]
,那么我如何才能获得获取阵列的主要活动?我已经研究发现,您可以使用
onPostExecute()
更改UI,并且我已经看到了一些返回字符串的方法(我不完全理解),但不是像我这样的
数组[][]

我的另一个问题是,一旦我加载了SoundPool声音,那么另一个SoundPool可以读取它们吗?我不确定声音是否实际加载到声音池本身,或者只是创建成一个整数,当调用
play()
方法时,该整数是可读的。如果不是,那么我似乎必须返回一个声音池和一个数组才能让代码正常工作。如果有人能给我一些真实的代码示例来解释这些东西,我将不胜感激


至于我在
doInBackground()
方法中的实际代码,它只包括上面第一块和第三块中显示的代码,以及声音池的创建。另外,如果有任何明显的错误/不在这里,我也很抱歉,因为我是Java新手,这是我关于StackOverflow的第一个问题。请告诉我您是否需要任何其他信息来更好地回答此问题。

我建议您创建一个回调接口,并使用活动实现,然后在AsyncClass中将此回调类的实例作为变量。回调函数可以接受您想要的任何参数。这是一种常见的设计模式,这里已经很好地解释了:


显然,您的界面将根据您的需要进行定制,但这对您来说是一个很好的提纲。

试试
AsyncTask
非常感谢。我想我以前听说过这种方法,但从来没有看到过一个好的例子。我现在还有一个问题。当我的主要活动开始时,如何在后台开始下载?我写过:
newsounddownloader(this.execute()
但是它给了我一个错误,说构造函数SoundDownloader是未定义的。如果不再看到您的代码,我会猜测SoundDownloader是您的asyncTask类,并且您没有编写构造函数
SoundDownloader(Activity活动)
(或者任何与此相关的构造函数)。因此,假定在运行时使用默认构造函数。您只需要显式地编写上面提到的构造函数如果不是这样的话,请告诉我,我在网上找到了更多的例子,我想出来了。无论如何谢谢你的帮助。