函数参数中3个点的含义是什么?

时间:2014-03-13 12:27:54

标签: java android android-asynctask

我正在阅读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个点是什么?

5 个答案:

答案 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)

答案 4 :(得分:1)

这三个点意味着可以将可变数量的参数传递给我们使用progress [0]或progress [1]等访问的函数。