2

我过去的两个问题很短且不详细,所以这次我会尽力而为。我有一个带有大约 430 种声音的大型音板。它太大了,我必须在某些设备上创建 2 个声音管理器。无论如何,在加载屏幕上,我正在尝试实现 AsyncTask。我大致了解它的类型及其4个步骤,但我不了解参数。这是一个简单的 AsyncTask 供参考。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {

    }
    return null;
}

protected void onProgressUpdate(Integer... progress) {

}

protected void onPostExecute(Long result) {

}
}

我需要在后台做的是像这样向我的经理添加声音: SoundManager2.addSound(415, R.raw.rubber);

拜托,这是我在这里的第三个问题,所以如果您需要任何其他信息,请不要犹豫,我将在接下来的 20 分钟内观看此主题,我会快速使用信息对其进行编辑!

4

1 回答 1

0

在您给出的示例中...

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {...}

URL、Integer 和 Long 三种类型(称为 Params、Progress、Result)可以是您需要的任何类型。

第一个 ( URL) 是必须传递给实例.execute(<params>)方法的参数类型。AsyncTask更准确地说,当您查看该doInBackground()方法时,您会看到URL...这基本上意味着它将接受一个URL. 即使您只需要传递一个URL,您仍然必须将其作为单项数组传递

URL[] myURLs = new URL[] {<comma-separated URLs here>};
new DownloadFilesTask().execute(myURLs);

doInBackground(URL... urls)您访问URLs asurls[0]urls[1]或类似的方法中for (URL u:urls)

此示例中的第二个泛型类型 ( Integer) 是预期的类型onProgressUpdate(Integer progress)。同样,这必须作为数组传递。例如,如果您要下载 10 个文件,则在下载每个文件后调用它。例如myProgress[0] = 1表示一个文件已成功下载。这允许您更新某种进度对话框。

最后,第三个泛型类型 ( Long) 再次在内部使用,是onDoInBackground(...)必须返回并传递给的类型onPostExecute(Long result)。请注意,这是单个结果,而不是数组。取决于你的结果将取决于onPostExecute()应该如何表现。

正如我所说,您可以使用任何类型,包括泛型Void(注意大写字母)......

private class MyAysncTask extends AsyncTask<Void, Void, Void>

在这种情况下,您不会传递任何东西.execute(),尽管您仍然可以调用publishProgress()(调用onProgressUpdate()),但您不能将任何数据传递给它。同样,onPostExecute不会收到任何实际结果数据。

于 2012-01-05T23:41:24.813 回答