“doInBackground(URL ... urls)”中的三个点是什么意思?

时间:2012-09-30 22:41:28

标签: android 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");
     }
 }

4 个答案:

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