"doInBackground(URL... urls)" 中的三个点代表什么意思?

9
每个函数中的“...”代表可以接受任意数量的参数。在最后一个函数中没有使用“...”,可能是因为它需要固定数量的参数。
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");
     }
 }

2
阅读此处:https://dev59.com/6nA75IYBdhLWcg3wrrNS - DPP
4个回答

13

正如Morrison所说的那样, ...语法用于变长参数列表(urls包含一个以上的URL)。

通常使用它允许AsyncTask的用户执行一些操作,比如(在您的情况下)传递多个要在后台获取的URL。如果只有一个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()中执行的一组操作的单个结果。例如,如果您下载多个URL,则可能会返回失败代码,如果其中任何一个失败。 onPostExecute()的输入参数将是您从doInBackground()返回的任何值。这就是为什么在这种情况下它们都是Long值的原因。
如果doInBackground()返回totalSize,那么该值将传递到onPostExecute(),在那里可以用它来通知用户发生了什么或进行任何其他后处理。
如果您确实需要作为后台任务的结果通信多个结果,则可以将Long泛型参数更改为不是Long的其他类型(例如某种集合)。

4

2
三个点...用于表示省略号,而在Java语言中,它们用于表示可变参数varargs(变量数量的参数)。

让我简要解释一下varargs

varargs允许方法接受零个或多个参数。如果我们不知道需要传递多少参数给方法,使用varargs是更好的方法。

varargs的语法:

Varargs使用ellipsis即三个点来表示。其语法如下:

返回类型 方法名(数据类型... 变量名){}

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)必须是最后一个参数。

1
非常简短(而基础)的答案: 这表示一个可变数量的项目“转换”为一个数组,并且它应该是最后一个参数。 例子:
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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接