0

我花了很多时间在网上研究这个。但是,我无法让我的 Asynctask 在后台加载 SoundPool 声音。我有 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 个(左右)中的一个。我的随机发生器看起来像这样:

 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[][]which 是加载数组(例如selectHello[])的数组,以使其更清晰/更简单地找到我需要的声音。

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

当我使用该doInBackground()方法时,它允许我返回 1 个项目,因此我尝试返回一个playList[][]已加载数组的数组。我有两个问题。首先,如果我要 return playList[][],那么我怎样才能让我的主要 Activity 来获取数组?我研究发现您可以使用 更改 UI onPostExecute(),并且我已经看到了一些返回字符串的方法(我不完全理解),但不是array[][]像我的那样。

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

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

4

1 回答 1

0

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

android asynctask向ui发送回调

您的界面显然会被定制以满足您的需求,但这对您来说是一个很好的大纲。

于 2013-07-03T04:07:19.997 回答