Что означает три точки в «doInBackground (URL … urls)»?

Что означает «…» в каждой функции? И почему в последней функции нет «…»?

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

Как сказал Моррисон, синтаксис ... для списка аргументов переменной длины ( 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() используется для того, чтобы фоновая задача способствовала достижению пользовательского интерфейса. Поскольку фоновая задача может включать несколько заданий (по одному для каждого параметра URL), имеет смысл опубликовать отдельные значения прогресса (например, от 0 до 100%) для каждой задачи. Вам не обязательно. Ваша фоновая задача, безусловно, могла бы вычислить общее значение прогресса и передать это единственное значение в onProgressUpdate() .

Метод onPostExecute() немного отличается. Он обрабатывает один результат из набора операций, выполняемых в doInBackground() . Например, если вы загружаете несколько URL-адресов, тогда вы можете вернуть код сбоя, если какой-либо из них не удался. onPostExecute() параметром onPostExecute() будет любое значение, которое вы возвращаете из doInBackground() . Вот почему в этом случае они оба являются значениями Long .

Если doInBackground() возвращает totalSize , то это значение будет передано onPostExecute() , где оно может использоваться для информирования пользователя о том, что произошло, или любой другой последующей обработки, какой вам нравится.

Если вам действительно нужно передать несколько результатов в результате фоновой задачи, вы можете, конечно, изменить параметр Long generic на нечто иное, чем Long (например, какую-то коллекцию).

В Java его называют Varargs, которые допускают переменное количество параметров.

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

Три точки ... используются для обозначения многоточия. В нашем случае на языке Java они используются для обозначения varangs (переменное число аргументов).

Позвольте мне немного рассказать о varangs :

Varangs позволяет методу принимать нулевые или многословные аргументы. Если мы не знаем, сколько аргументов нам нужно передать в методе, varargs – лучший подход.

Синтаксис varargs:

Varargs использует эллипсис, т. Е. Три точки после типа данных. Синтаксис выглядит следующим образом:

return_type method_name(data_type... variableName){}

Простой пример Varargs в 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 вы должны следовать некоторым правилам, иначе программный код не будет компилироваться. Правила заключаются в следующем:

В методе может быть только один переменный аргумент. Аргумент переменной (varargs) должен быть последним аргументом.