我正在阅读Android文档中的AsyncTask。
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");
}
}
问题是doInBackground(URL... urls)
这3个点是什么?
答案 0 :(得分:6)
这不是Android功能。这是一个包含的Java功能(在Java 5中添加),因此您可以自定义&#34;自定义&#34;参数。
此方法:
protected Long doInBackground(URL... urls) {
for (URL url : urls) {
// Do something with url
}
}
和这一个:
protected Long doInBackground(URL[] urls) {
for (URL url : urls) {
// Do something with url
}
}
内部方法的是相同的。 整个区别在于你调用它的方式。 对于第一个(也称为varargs),您可以简单地执行此操作:
doInBackground(url1,url2,url3,url4);
但是对于第二个你必须创建一个数组,所以如果你尝试只在一行中执行此操作,它将是:
doInBackground(new URL[] { url1, url2, url3 });
好消息是,如果你尝试调用那种使用varargs编写的方法,那么它的工作方式与它不是(向后支持)的方式相同。
答案 1 :(得分:4)
这意味着此函数采用可变数量的参数 - 其arity是可变的。例如,所有这些都是有效的调用(假设它绑定到AsyncTask
的实例):
this.doInBackground(); // Yes, you could pass no argument
// and it'd be still valid.
this.doInBackground(url1);
this.doInBackground(url1, url2);
this.doInBackground(url1, url2, url3);
// ...
在方法体内,urls
基本上是一个数组。关于varargs的一个有趣的事情是你可以用两种方式调用这样的方法 - 通过传递一个参数数组,或者通过指定每个url作为一个单独的方法参数。所以,这两个是等价的:
this.doInBackground(url1, url2, url3);
this.doInBackground(new URL[] {url1, url2, url3});
你可以使用for循环遍历所有这些:
protected Long doInBackground(URL... urls) {
for (URL url : urls) {
// Do something with url
}
}
您当然可以自己定义类似的方法,例如:
public void addPerson (String name, String... friends) {
// ...
}
在此示例中,您的方法将接受一个必需参数(name
,您不能忽略此参数)和可变数量的friends
参数:
this.addPerson(); // INVALID, name not given
this.addPerson("John"); // Valid, but no friends given.
this.addPerson("John," "Kate"); // Valid, name is John and one friend - Kate
自Java 5以来,这个结构不可用。您可以找到文档here。
答案 2 :(得分:3)
这三个点表示函数的可变长度参数。
答案 3 :(得分:2)
这个问题显示了很少的研究工作,因为Stackoverflow上已经存在多个重复项:
What do three dots (...) indicate when used as a part of parameters during method definition?
What is it called when you use object... as a parameter?
What are the 3 dots in parameters?/What is a variable arity (...) parameter?
答案 4 :(得分:1)
这三个点意味着可以将可变数量的参数传递给我们使用progress [0]或progress [1]等访问的函数。