2012-09-30 48 views
7

每個函數中的「...」是什麼意思?爲什麼在最後一個函數中沒有「...」?「doInBackground(URL ... url)」中的三個點是什麼意思?

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

在這裏閱讀:http://stackoverflow.com/questions/3158730/java- 3-點-in參數 – star18bit

回答

12

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()用來讓後臺任務交流進展情況到用戶界面。由於後臺任務可能涉及多個作業(每個URL參數一個作業),因此爲每個任務發佈單獨的進度值(例如0至100%完成)可能是有意義的。你不需要。您的後臺任務當然可以選擇計算總計進度值,並將該單一值傳遞給onProgressUpdate()

onPostExecute()方法有點不同。它處理來自在doInBackground()中完成的一組操作的結果單一結果。例如,如果您下載了多個URL,那麼如果其中任何一個都失敗,則可能會返回失敗代碼。 onPostExecute()的輸入參數將爲返回doInBackground()開始的任何值。這就是爲什麼,在這種情況下,它們都是Long的值。

如果doInBackground()返回totalSize,那麼該值將在onPostExecute()上傳遞,在那裏它可以用於通知用戶發生了什麼事情,或者您喜歡的其他後處理。

如果你真的需要通信的多個結果作爲背景任務的結果,可以肯定的Long泛型參數更改爲比Long(例如一些集合類)以外的東西。

1

這三個點是...用於表示ellipsis,在我們的Java語言的情況下,它們用於指示varangs(變量的參數號)。

讓我解釋一下關於varangs一點點:

varangs可以接受零個或muliple 參數的方法。如果我們不知道有多少參數需要通過 該方法,則可變參數是更好的方法。可變參數的

語法:

varargs數據類型後使用ellipsis即三個點。語法如下:

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 
} 
} 

規則可變參數:

當使用可變參數,您必須遵循一些規則,否則程序 代碼將無法編譯。規則如下:

方法中只能有一個變量參數。變量 參數(可變參數)必須是最後一個參數。

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

相關問題