我花了很多时间在网上研究这个。但是,我无法让我的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[][]
这是一个已加载数组的数组(例如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 :(得分:0)
我建议您创建一个回调接口,并使用您的活动实现,然后将此回调类的实例作为AsyncClass中的变量。回调可以采用您想要的任何参数。这是一种常见的设计模式,这里已经很好地解释了:
android asynctask sending callbacks to ui
您的界面显然会根据您的需求进行定制,但这对您来说非常好。