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");
     }
 }
4

4 回答 4

13

正如莫里森所说...语法适用于可变长度的参数列表(urls包含多个URL)。

这通常用于允许用户AsyncTask执行诸如(在您的情况下)传递多个 URL 以在后台获取的操作。如果您只有一个 URL,则可以这样使用DownloadFilesTask

DownloadFilesTask worker = new DownloadFilesTask();
worker.execute(new URL("http://google.com"));   

或使用多个 URL,请执行以下操作:

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通用参数更改为 a 以外的其他Long值(例如某种集合)。

于 2012-09-30T23:00:24.957 回答
4

在 Java 中,它称为 Varargs,它允许可变数量的参数。

http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

于 2012-09-30T22:44:04.193 回答
2

这三个点...用于表示省略号,在我们的 Java 语言中,这些点用于表示varangs(可变参数数量)。

让我稍微解释一下varangs

varangs允许方法接受零个或多个参数。如果我们不知道必须在方法中传递多少个参数,varargs 是更好的方法。

可变参数的语法:

可变参数使用省略号,即数据类型后的三个点。语法如下:

return_type method_name(data_type... variableName){}

java中可变参数的简单示例:

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

于 2017-01-06T11:34:52.867 回答
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);

于 2018-01-01T22:45:23.877 回答