每个函数中的“...”是什么意思?为什么在最后一个函数中,没有“......”?
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
答案 0 :(得分:13)
As Morrison said,...
语法用于变量长度的参数列表(urls
包含多个URL
)。
这通常用于允许AsyncTask
的用户执行(在您的情况下)传递多个URL的内容以在后台获取。如果您只有一个网址,则可以使用DownloadFilesTask
这样的网址:
DownloadFilesTask worker = new DownloadFilesTask();
worker.execute(new URL("http://google.com"));
或使用多个网址,请执行以下操作:
worker.execute(new URL[]{ new URL("http://google.com"),
new URL("http://stackoverflow.com") });
onProgressUpdate()
用于让后台任务将进度传达给UI。由于后台任务可能涉及多个作业(每个URL参数一个),因此为每个任务发布单独的进度值(例如0到100%完成)可能是有意义的。你不必。您的后台任务当然可以选择计算总进度值,并将该单个值传递给onProgressUpdate()
。
onPostExecute()
方法略有不同。它处理来自doInBackground()
中完成的一组操作的单个结果。例如,如果您下载多个网址,则可能会在任何失败时返回失败代码。 onPostExecute()
的输入参数将是您从doInBackground()
返回的任何值。这就是为什么,在这种情况下,它们都是Long
值。
如果doInBackground()
返回totalSize
,则该值将在onPostExecute()
上传递,可用于通知用户发生了什么,或者您喜欢的其他任何后期处理。
如果您确实需要根据后台任务传达多个结果,则可以将Long
泛型参数更改为Long
以外的其他参数(例如某种收藏品。)
答案 1 :(得分:4)
在Java中,它称为Varargs,允许可变数量的参数。
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html
答案 2 :(得分:2)
三个点...
用于表示ellipsis,在我们的Java语言中,这些用于表示varangs(变量参数号)。
让我解释一下varangs:
varangs允许该方法接受零或多个 如果我们不知道我们将要传递多少论点 方法,varargs是更好的方法。
varargs的语法:
varargs使用ellipsis,即数据类型后的三个点。语法如下:
return_type method_name(data_type... variableName){}
java中Varargs的简单示例:
class VarargsExample1{
static void display(String... values){
System.out.println("display method invoked ");
}
public static void main(String args[]){
display();//zero argument
display("my","name","is","varargs");//four arguments
}
}
varargs规则:
使用varargs时,您必须遵循一些规则,否则编程 代码不会编译。规则如下:
方法中只能有一个变量参数。变量 参数(varargs)必须是最后一个参数。
答案 3 :(得分:0)
非常简短(和基本)答案: 这表示可变数量的项目“转换”为数组,它应该是最后一个参数。 例如:
test("string", false, 20, 75, 31);
void test(String string, boolean bool, int... integers) {
// string = "string"
// bool = false
// integers[0] = 20
// integers[1] = 75
// integers[2] = 31
}
但你也可以打电话给
test("text", true, 15);
或
test("wow", true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 123, 345, 9123);