2012-09-30 35 views
7

"..." trong mỗi hàm có nghĩa là gì? và tại sao trong chức năng cuối cùng, không có "..."?ba dấu chấm trong "doInBackground (URL ... url)" có nghĩa là gì?

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

đọc đây: http://stackoverflow.com/questions/3158730/java- Tham số 3 dấu chấm – star18bit

Trả lời

12

As Morrison said, các ... cú pháp là cho một biến danh sách chiều dài của đối số (urls nắm giữ nhiều hơn một URL).

Điều này thường được sử dụng để cho phép người dùng của AsyncTask làm những việc như (trong trường hợp của bạn) chuyển vào nhiều hơn một URL để tìm nạp trong nền. Nếu bạn chỉ có một URL, bạn sẽ sử dụng DownloadFilesTask của bạn như thế này:

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

hoặc với nhiều URL, làm điều này:

worker.execute(new URL[]{ new URL("http://google.com"), 
          new URL("http://stackoverflow.com") }); 

Các onProgressUpdate() được sử dụng để cho các tác vụ chạy nền giao tiến bộ vào giao diện người dùng. Vì tác vụ nền có thể liên quan đến nhiều công việc (một cho mỗi thông số URL), nên có thể xuất bản các giá trị tiến trình riêng biệt (ví dụ: 0 đến 100% hoàn thành) cho mỗi tác vụ. Bạn không phải làm vậy. Nhiệm vụ nền của bạn chắc chắn có thể chọn để tính tổng giá trị tiến trình và chuyển giá trị đó cho onProgressUpdate().

Phương pháp onPostExecute() hơi khác một chút. Nó xử lý một kết quả đơn, từ tập hợp các hoạt động đã được thực hiện trong doInBackground(). Ví dụ: nếu bạn tải xuống nhiều URL, thì bạn có thể trả về mã lỗi nếu bất kỳ số nào trong số đó không thành công. Thông số đầu vào là onPostExecute() sẽ là giá trị bất kỳ của bạn trả lại từ doInBackground(). Đó là lý do tại sao, trong trường hợp này, chúng là cả hai giá trị Long.

Nếu doInBackground() trả về totalSize, thì giá trị đó sẽ được chuyển qua số onPostExecute(), nơi nó có thể được sử dụng để thông báo cho người dùng điều gì đã xảy ra hoặc bất kỳ xử lý hậu kỳ nào bạn thích.

Nếu bạn thực sự cần phải giao tiếp nhiều kết quả như là kết quả của nhiệm vụ nền của bạn, bạn có thể chắc chắn thay đổi các tham số chung Long một cái gì đó khác hơn là một Long (ví dụ một số loại bộ sưu tập).

1

Ba dấu chấm là ... được sử dụng để biểu thị ellipsis, Trong trường hợp của chúng tôi bằng ngôn ngữ Java, chúng được sử dụng để biểu thị varangs (biến số của đối số).

Hãy để tôi giải thích một chút về varangs:

Các varangs cho phép các phương pháp để chấp nhận hoặc không muliple đối số.Nếu chúng ta không biết có bao nhiêu đối số, chúng ta sẽ phải vượt qua trong phương thức , varargs là cách tiếp cận tốt hơn.

Cú pháp của varargs:

Các varargs sử dụng ellipsis ví dụ: ba dấu chấm sau tên kiểu dữ liệu. Cú pháp như sau:

return_type method_name(data_type... variableName){}

Ví dụ đơn giản của varargs trong 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 
} 
} 

Rules cho varargs:

Trong khi sử dụng varargs, bạn phải tuân theo một số quy tắc nếu không chương trình mã sẽ không biên dịch. Các quy tắc như sau:

Chỉ có thể có một đối số biến trong phương thức. Biến đối số (varargs) phải là đối số cuối cùng.

0

Rất ngắn (và cơ bản) trả lời: Đó đại diện cho một số biến các mặt hàng "chuyển đổi" để một mảng và nó sẽ là đối số cuối cùng. Ví dụ:

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 
} 

Nhưng bạn cũng có thể gọi

test("text", true, 15);

hoặc

test("wow", true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 123, 345, 9123);

Các vấn đề liên quan