2012-09-30 16 views
7

¿Qué significa "..." en cada función? y por qué en la última función, no hay "..."?¿Qué significan los tres puntos en "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"); 
    } 
} 
+2

leer aquí: http://stackoverflow.com/questions/3158730/java- 3-puntos-en-parámetros – star18bit

Respuesta

12

As Morrison said, la ... sintaxis es para una variable lista longitud de argumentos (urls mantiene más de un URL).

Esto normalmente se usa para permitir a los usuarios de AsyncTask hacer cosas como (en su caso) pasar más de una URL para que se busquen en segundo plano. Si sólo tiene una dirección URL, debe utilizar su DownloadFilesTask así:

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

o con múltiples direcciones URL, haga lo siguiente:

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

El onProgressUpdate() se utiliza para permitir que la tarea de fondo comunicar el progreso a la IU. Como la tarea en segundo plano puede implicar trabajos múltiples (uno para cada parámetro de URL), puede tener sentido publicar valores de progreso por separado (por ejemplo, de 0 a 100% completado) para cada tarea. No es necesario. Su tarea en segundo plano ciertamente podría elegir calcular un valor de progreso total, y pasar ese valor único a onProgressUpdate().

El método onPostExecute() es un poco diferente. Procesa un resultado único, del conjunto de operaciones que se realizaron en doInBackground(). Por ejemplo, si descarga varias URL, puede devolver un código de falla si el falló. El parámetro de entrada onPostExecute() tendrá el valor que devuelva de doInBackground(). Es por eso que, en este caso, ambos valores son Long.

If doInBackground() vuelve totalSize, entonces ese valor se transmitirán onPostExecute(), donde se puede utilizar para informar al usuario de lo que sucedió, o cualquier otra post-procesamiento que te gusta.

Si realmente necesita para comunicar múltiples resultados como resultado de su tarea en segundo plano, que sin duda puede cambiar el parámetro genérico Long a algo que no sea un Long (por ejemplo algún tipo de colección).

1

Los tres puntos son ... se utilizan para indicar ellipsis, en nuestro caso en lenguaje Java se utilizan para indicar varangs (número de argumentos).

Vamos a explicar un poco acerca de varangs:

El varangs permite que el método de aceptar cero o Muliple argumentos.Si no sabemos cuántos argumentos tendremos que pasar en el método, varargs es el mejor enfoque.

Sintaxis de varargs:

El varargs utiliza ellipsis es decir, tres puntos después de que el tipo de datos. Sintaxis es la siguiente:

return_type method_name(data_type... variableName){}

Ejemplo simple de Varargs en 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 
} 
} 

Reglas para varargs:

Durante el uso de la varargs, debe seguir algunas reglas; de lo contrario, el programa no se compilará. Las reglas son las siguientes:

Solo puede haber un argumento variable en el método. Variable argumento (varargs) debe ser el último argumento.

0

muy corta (y básico) respuesta: Eso representa un número variable de elementos "convertido" a una matriz y que debería ser el último argumento. Ejemplo:

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 
} 

Pero también se puede llamar

test("text", true, 15);

o

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

Cuestiones relacionadas